获取所有记录,包括不匹配的记录

时间:2012-10-05 12:53:19

标签: sql sql-server-2008 tsql

我有以下表格

付款

PayTypeId,描述

  • 0,Credit
  • 1,借记
  • 2,万事达

ActualPayment ID,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

4 个答案:

答案 0 :(得分:2)

您没有收到任何记录,因为您使用WHEREp.paytypeid is null <{1>}过滤了所有内容

尝试在没有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 :(得分: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

答案 2 :(得分:0)

我想你想要一个完整的外部加入:

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

这将返回ActualPayments表中的所有行以及来自Payment的相应值 - 如果有的话。此外,它将返回Payment中没有ActualPayments的所有行 请注意:不得使用示例查询的where子句!

答案 3 :(得分: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
相关问题