2015-07-09 62 views
0

我想弄清楚如何使用連接獲得相同的結果,因爲我會使用不存在的條件。等價查詢使用連接,而不是不存在

舉例來說,如果我有以下兩個表:

表1

-------------- 
|ID | EXT_ID | 
|1 | A  | 
|2 | B  | 
|3 | C  | 
-------------- 

表2

------------------------- 
|EXT_ID | TB1_ID |PRIMARY| 
|A  | 1  |1  | 
|A  | 1  |0  | 
|B  | 2  |0  | 
|B  | 2  |0  | 
------------------------- 

如果我想找到從表1中的記載,在表2中沒有主標誌爲1的情況下,對於表2中實際上有一個子項的記錄(爲了排除孤兒),我可以簡單地寫下面的內容(預期僅從表1返回ID 2):

SELECT TB1.ID FROM Table1 TB1 
JOIN Table2 
ON Table1.EXT_ID = Table2.EXT_ID 
WHERE Table2.Primary = 0 
AND NOT EXISTS 
(
SELECT * FROM Table2 TB2 
WHERE TB1.ID = TB2.TB1_ID 
AND TB2.PRIMARY = 1 
) 

有沒有辦法用連接做到這一點?如果是這樣,使用不存在與聯接會有多大的效率?

在此先感謝!

編輯:固定表。

+0

我很好奇,如果你有查詢是拉回結果,你爲什麼要重構它?它運行速度不合理嗎? – user2366842

+0

此外,我猜不是,提供的信息,但它可能是主要等於一些數字以外的零或1,或者這是一個布爾字段? – user2366842

+0

它應該只等於1或0,如果它包含其他值,我會使用isnull。我嚴格地希望在練習中有不同的表現。 – tchock

回答

1
with x as (select Ext_ID, Tb1_ID, Sum(Primary) as sum_primary 
from Table2 group by Ext_ID,Tb1_ID) 

SELECT TB1.ID 
FROM Table1 TB1 JOIN x 
ON Table1.EXT_ID = x.EXT_ID 
where x.sum_primary = 0 

可以使用CTE這一點。

+0

如果PRIMARY字段讓我們說一個字符串,比如「yes」,「no」,「maybe」,並且我只想返回具有「yes」的結果, 「在孩子的桌子上?希望這是有道理的。 – tchock

+1

是的..你會在這種情況下使用COUNT。 –

+0

好點。謝謝! – tchock

0
SELECT 
    TB1.ID, TB1.EXT_ID 
FROM 
    TABLE1 TB1 
    JOIN TABLE2 TB2 ON TB1.ID = TB2.TB1_ID AND TB1.EXT_ID = Table2.EXT_ID 
GROUP BY 
    TB1.ID, TB1.EXT_ID 
HAVING MAX(TB2.[PRIMARY]) = 0 
相關問題