简体   繁体   English

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

[英]sql track lack of record for a certain person upon inner join

I have a query that goes this way but I am wondering if there is a better way to do rather than the below attempt? 我有这样的查询,但我想知道是否有比下面的尝试更好的方法?

List the credit balance of all members who have less than 50 credits in their CreditBalance and have not done any transactions in the year 2018 . 在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)

This filters only on the transactions in the range, then the cdt.CardNo is null (since that's the join criteria) will means there's on cdt records in that range. 这仅对范围内的事务进行过滤,然后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

What you can also do is to create a subquery in the where clause. 您还可以做的是在where子句中创建一个子查询。 But it is almost the same what you already did: 但这与您已经做的几乎相同:

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) 
    )

I like to use EXISTS in this type of situation. 我喜欢在这种情况下使用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