左连接没有给出想要的结果

Amr*_*ngh -2 join sql-server

我有两个数据集

FEES                    PAYMENTS            
CrsCode InstNo  FEE     Regno   CRSCODE Instno  Payment
CA1        -2   100     R1     CA1      -2       100
CA1        -1   200     R1     CA1      -1       200
CA1         1   200     R1     CA1       1       200
CA1         2   300                 

DESIRED OUTPUT                          
REGNO   CRSCODE INSTNO  FEE PAID    DIFF        
R1          CA1  -2   100   100     0       
R1          CA1  -1   200   200     0       
R1          CA1   1   200   200     0       
R1          CA1   2   300   0       300     

OUTPUT I AM GETTING                         
REGNO   CRSCODE INSTNO     FEE     PAID  DIFF       
R1          CA1   -2       100     100   0
R1          CA1   -1       200     200   0      
R1          CA1    1       200     200   0      
null        null   null    300     null  null
Run Code Online (Sandbox Code Playgroud)

我正在使用的查询

select a.Regno,a.crscode,b.fee,a.payment,b.fee-a.payment from Fees as b Left join
Payments as a on a.CrsCode=b.CrsCode and a.InstNo=b.InstNo
Run Code Online (Sandbox Code Playgroud)

请找到SQLFiddle

Aar*_*and 7

;WITH regCrs AS 
(
  SELECT regno, crsCode FROM dbo.PAYMENTS
  GROUP BY regno, crsCode
),
f AS 
( 
  SELECT f.crsCode, f.instNo, f.fee, regCrs.regno
  FROM regCrs INNER JOIN dbo.FEES AS f
  ON regCrs.crsCode = f.crsCode
)
SELECT f.regno, f.crsCode, f.instNo, f.fee,
  paid = COALESCE(p.payment, 0),
  DIFF = f.fee - COALESCE(p.payment, 0)
FROM f
LEFT OUTER JOIN dbo.PAYMENTS AS p
ON f.crsCode = p.crsCode
AND f.instNo = p.instNo;
Run Code Online (Sandbox Code Playgroud)

结果:

REGNO  CRSCODE  INSTNO  FEE  PAID  DIFF
=====  =======  ======  ===  ====  ====
r1     CA1      -2      100  100   0
r1     CA1      -1      200  200   0
r1     CA1      1       200  200   0
r1     CA1      2       300  0     300
Run Code Online (Sandbox Code Playgroud)

SQLfiddle

  • 好吧,对于数百万行,这可能不会表现出色,但是您还没有真正给我们足够的信息来正确解决可能出现的任何性能问题。如果您想“简化”“复杂查询”,因此我们无法帮助优化此数据的*源*,那么我们无能为力来帮助优化最终结果。 (4认同)
  • @AmritpalSingh 在这一点上,在这里选择答案可能会更好,因为听起来这适用于问题 **如所写** 并提出一个关于可扩展解决方案的新问题。 (3认同)