[英]sql track lack of record for a certain person upon inner join
我有這樣的查詢,但我想知道是否有比下面的嘗試更好的方法?
在CreditBalance中列出所有信用額少於50且在2018年未進行任何交易的成員的信用余額。
SELECT m.CreditBalance
FROM Member m
INNER JOIN CreditCard cc
ON m.MemberID=cc.MemberID
INNER JOIN CreditDebitTrans cdt
ON cc.CardNo=cdt.CardNo
WHERE (cdt.TransDateTime != DATEPART(Year,2018)
AND
m.CreditBalance<50)
這僅對范圍內的事務進行過濾,然后cdt.CardNo為null(因為這是聯接條件)將意味着該范圍內的cdt記錄存在。
SELECT m.memberid, m.CreditBalance
FROM Member m
INNER JOIN CreditCard cc
ON m.MemberID=cc.MemberID
LEFT OUTER JOIN CreditDebitTrans cdt
ON cc.CardNo=cdt.CardNo and cdt.TransDateTime>='2018-01-01' and cdt.TransDateTime<'2019-01-01'
WHERE cdt.CardNo Is Null and m.CreditBalance<50
group by m.memberid, m.CreditBalance
您還可以做的是在where子句中創建一個子查詢。 但這與您已經做的幾乎相同:
SELECT
m.CreditBalance
FROM
Member m
WHERE
m.CreditBalance<50
AND m.MemberID NOT IN (
SELECT
cc.MemberID
FROM
CreditCard cc
INNER JOIN
CreditDebitTrans cdt
WHERE
cdt.TransDateTime = DATEPART(Year,2018)
)
我喜歡在這種情況下使用EXISTS
。
SELECT m.CreditBalance
FROM Member m
WHERE
m.CreditBalance < 50
-- There are no transactions for the member in 2018:
AND NOT EXISTS (
SELECT 1
FROM CreditCard cc
INNER JOIN CreditDebitTrans cdt ON cdt.CardNo = cc.CardNo
WHERE cc.MemberID = m.MemberID
AND cdt.TransDateTime >= '2018-01-01'
AND cdt.TransDateTime < '2019-01-01'
);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.