繁体   English   中英

sql跟踪内部联接时某人的记录不足

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM