3

我有以下表格

支付

PayTypeId,描述

  • 0 , 信用
  • 1、借记
  • 2、大师

ActualPayment Id,PayTypeId,Amount

  • 1,1,10

这是我正在查看的输出

Id,PayTypeId,金额

  • 1,0,空
  • 1,1,10
  • 1,2,空

基本上我想要 ActualPayment 的所有记录,包括所有付款类型。

这是我使用过但没有得到任何记录的查询

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

4 回答 4

2

您没有收到任何记录,因为您正在使用该WHERE子句过滤掉所有内容p.paytypeid is null

尝试在没有WHERE子句的情况下运行它。

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

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 
;
于 2012-10-05T13:00:45.500 回答
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
于 2012-10-05T13:01:56.043 回答
0

我想你想要一个完整的外部连接:

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

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

于 2012-10-05T13:00:23.623 回答
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
于 2012-10-05T13:12:47.337 回答