[英]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.