簡體   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