2013-12-13 67 views
1

我有一個包含數據如下選擇開放代碼的所有記錄,但未打開的日期晚於打開的日期?

AccountNo Code Date 
123456 OpenCS 01/12/2013 
123456 CloseCS 03/12/2013 
123456 CALLIN 11/10/2013 
123456 CloseCS 08/08/2009 
111587 OpenCS 12/12/2013 
111587 CloseCS 01/12/2013 

我需要得到的是一個完整的OpenCS代碼的所有賬戶,但OpenCS

所以我有2個後無CloseCS表選擇querys

Select AccountNo, Code, Date FROM tblTrans 
WHERE Code = ‘OpenCS’ 

Select AccountNo, Code, Date FROM tblTrans 
WHERE Code = ‘CloseCS’ 

哪裏下跌是加入這些獲得所需的數據。試了幾個連接,但不能得到選擇排除記錄。

因此,它只會返回賬戶111587,因爲Close是在Open之前完成的。

回答

2

使用NOT EXISTS

SELECT t.* 
FROM tblTrans t 
WHERE Code = 'OpenCS' 
AND NOT EXISTS 
(
    SELECT 1 FROM tblTrans t2 
    WHERE t2.AccountNo = t.AccountNo 
    AND t2.Date > t.Date 
    AND t2.Code = 'CloseCS' 
) 

Demo

ACCOUNTNO CODE DATE 
111587  OpenCS December, 12 2013 00:00:00+0000 

值得一讀在這種情況下:should I use NOT IN, OUTER APPLY, LEFT OUTER JOIN, EXCEPT, or NOT EXISTS?(結論:NOT EXISTS通常將是您最好的選擇)

+0

http:// stac koverflow.com/questions/1597442/subquery-using-exists-1-or-exists – dav1dsm1th

+0

@ dav1dsm1th:謝謝,但你爲什麼發佈這個鏈接?如果你在'EXISTS'中使用'NULL'或'1'或'*'或其他任何東西,這是一個偏好問題,因爲無論如何都沒有選擇。我比較喜歡'1',因爲它簡短易讀。 –

+0

我很確定'*'和'1'的長度是相同的,並且具有相同的可讀性 - 但是不會讓選擇一個(這是我的偏好)對性能產生影響的神話永遠存在。 – dav1dsm1th

0
SELECT t1.AccountNo 
FROM tblTrans T1 
INNER JOIN tblTrans T2 ON T1.AccountNo = T2.AccountNo 
WHERE T1.Code = 'OpenCS' AND T2.Code = 'CloseCS' AND T2.Date < T1.Date 
相關問題