我有以下表格
付款
PayTypeId,描述
ActualPayment ID,PayTypeId,金额
这是我正在看的输出
标识,PayTypeId,金额
基本上我想要所有的ActualPayment记录,包括所有支付类型。
这是我用过的查询,但没有得到任何记录
select
*
from #ActualPayments ap
left join #Payment p on ap.paytypeid = p.paytypeid
where p.paytypeid is null
答案 0 :(得分:2)
您没有收到任何记录,因为您使用WHERE
条p.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