2012-10-05 98 views
3

我有以下表让所有记录,包括不匹配的记录

付款

PayTypeId,说明

  • 0,信用
  • 1,借记
  • 2人,硕士

Ac tualPayment 标识,PayTypeId,金额

  • 1,1,10

这里是输出我在看

标识,PayTypeId,金额

  • 1,0 ,NULL
  • 1,1,10
  • 1,2,NULL

基本上我希望ActualPayment的所有记录包括所有付款类型。

下面是我用,但我没有得到任何记录

select 
* 
from #ActualPayments ap 
left join #Payment p on ap.paytypeid = p.paytypeid 
where p.paytypeid is null 
+0

使用OUTER连接 – Randy

+7

@Randy - 一个'LEFT JOIN' *** ***是外联接...... – MatBailie

回答

2

如果你想为三个PayTypeID值中的一个记录,那么你需要在LEFT JOIN的左侧的三个记录。

同样,如果您想要在每个输出行上输入ActuallPaymentID,则该值需要位于左侧。

这一切都会导致您错误地认识到您拥有的数据以及您所描述的表格。


只需在你的问题这两个表的,我会用这个布局,而不是...

SELECT 
    ap.ActualPaymentID, 
    p.PayTypeID, 
    SUM(CASE WHEN ap.PayTypeID = p.PayTypeID THEN ap.Amount END) AS Amount 
FROM 
    ActualPayments     AS ap 
CROSS JOIN 
    Payment       AS p 
GROUP BY 
    ap.ActualPaymentID, 
    p.PayTypeID 
+0

已更新的答案更正了语法错误:我忘记在'CASE'语句中放置一个'END'。 – MatBailie

+0

这是一个非常好的答案(+1) – acatt

+0

Dems-你的查询是完美的。非常感谢。其他查询我得到重复 – VKarthik

0

我想你想完全外部联接的查询:

select 
* 
from #ActualPayments ap 
full outer join #Payment p 
    on ap.paytypeid = p.paytypeid 
; 

这将一起返回从ActualPayments表中的所有行与支付的相应值 - 如果有的话。此外,它将返回Payment没有ActualPayments存在的所有行。
请注意:您的示例查询的where子句一定不能使用!

+0

给'NULL's在'ap.ID'场(其中PayTypeID为0或者2) 。这与OP的期望输出不匹配。 – MatBailie

+0

OPs样本数据很可能是当时虚构的。该ID从哪里来? –

+0

OPs问题:'基本上我想要ActualPayment的所有记录,包括所有支付类型.' OP的问题的解释:返回一个记录,用于'ActualPaymentID'和'PayTypeID'的每个不同组合,包括*(这里我假设; ActualPaymentID不唯一)*与每个组合对应的'金额'的总和。 * [这意味着ActualPaymentID来自ActualPayment表,在这种情况下。看到我的例子答案。] * – MatBailie

2

您还没有收到任何记录,因为你与WHERE条款p.paytypeid is null

尝试没有WHERE条款运行它过滤所有的东西。

编辑:下面的SQL应该返回正确的信息。我用CROSS JOIN创建了一个内嵌视图。这应该删除不需要的NULL

SELECT t1.id, t1.paytypeid, t2.amount 
FROM ( 
    SELECT id, payment.paytypeid 
    FROM #ActualPayments 
    CROSS JOIN #Payment 
) t1 
LEFT OUTER JOIN #ActualPayments t2 
    ON t1.paytypeid = t2.paytypeid 
; 
+1

仍然无法正常工作。按照您的描述进行操作会得到1条记录,操作步骤会显示3条期望的输出记录。 – MatBailie

+0

@请问您是否正确。我刚刚测试过这个,因为需要'RIGHT OUTER JOIN'。 – acatt

+1

使用'RIGHT OUTER JOIN','PayTypeID'永远不会为NULL,但其中两行的'ActualPaymentID'为NULL。输出仍然不匹配。 – MatBailie

0

我很困惑,为什么你会想这样做,但这里有一个方法

select ap.Id, pt.PayTypeId, ap2.Amount 
from #ActualPayments ap 
    cross join #PaymentTypes pt 
    left join #ActualPayments ap2 
    on pt.PayTypeId = ap2.PayTypeId 
    and ap.Id = ap2.id 
相关问题