2008-12-03 204 views

回答

27

INTERSECT是內連接。 MINUS是一個外連接,您只能選擇其他表中不存在的記錄。


INTERSECT

select distinct 
    a.* 
from 
    a 
    inner join b on a.id = b.id 

減號

select distinct 
    a.* 
from 
    a 
    left outer join b on a.id = b.id 
where 
    b.id is null 

如果要修改原來的問題,並張貼一些示例數據,然後一個例子可以說明。

編輯:忘了添加在不同的查詢。

+0

美麗的答案:) – 2008-12-03 14:15:53

+0

爲什麼這麼說?該邏輯產生與SQL標準INTERSECT和MINUS相同的結果。 – LeppyR64 2008-12-03 15:12:25

+0

這正是我所說的,我被拒絕了。呃,好吧。 +1,因爲你花時間去實際給出語法示例。 – 2008-12-03 15:18:01

3

它們通過JOIN完成。老式的方式:)

對於INTERSECT,您可以使用INNER JOIN。非常簡單。只需要使用GROUP BY或DISTINCT,如果你沒有進行純粹的一對一關係。否則,正如其他人所提到的那樣,您可以獲得比預期更多的結果。

對於MINUS,您可以使用LEFT JOIN並使用WHERE來限制它,這樣您只能從主表中取回與LEFT JOINed表不匹配的行。

簡單易行。

+0

我也被拒絕了,但你的回答是正確的。 – LeppyR64 2008-12-03 15:40:29

0

不幸的是,MINUS在MS Access中不受支持 - 一種解決方法是創建三個查詢,一個帶有完整的數據集,一個用於拉取要過濾的行,第三個用於僅連接兩個表,拉取只存在於完整數據集中的記錄。

INTERSECT的情況也是如此,只不過你會通過內部連接來完成它,並且只返回兩個存在的記錄。

12

INTERSECT不是內部聯接。他們不同。 INNER JOIN會在INTERSECT不會的情況下給你重複的行。您可以通過以下方式獲得等效結果:

SELECT DISTINCT a.* 
FROM a 
INNER JOIN b 
    on a.PK = b.PK 

請注意,PK必須是主鍵列或多列。如果在表上沒有PK(BAD!),你必須把它寫像這樣:

SELECT DISTINCT a.* 
FROM a 
INNER JOIN b 
    ON a.Col1 = b.Col1 
    AND a.Col2 = b.Col2 
    AND a.Col3 = b.Col3 ... 

帶有負,你可以做同樣的事情,但有一個LEFT JOIN,併爲空WHERE條件檢查在表b的不可空列(最好是主鍵)之一上。

SELECT DISTINCT a.* 
FROM a 
LEFT JOIN b 
    on a.PK = b.PK 
WHERE b.PK IS NULL 

應該這樣做。