2016-09-21 86 views
2

首先,我看到一個類似的問題在這裏問:Query two tables from different schema,但答案並不適用於我。從不同模式查詢兩個表,但數據庫相同

我的情況:同一個表,不同的模式,相同的數據庫(oracle的方式)。我試圖找到一個schema.table中不在另一箇中的所有行。我有以下查詢:

select S1.ID 
FROM SCHEMA1.DATABASE_UPDATE S1, 
SCHEMA2.DATABASE_UPDATE S2 
WHERE 
S1.ID != S2.ID 

我得到成千上萬的重複條目。很明顯,這是錯誤的。 S1中有448行,S2中有439行。應該只有9個唯一的行。我究竟做錯了什麼?謝謝!

順便說一下,我從sqlDeveloper這樣做。

回答

0

您正在獲取兩個模式中的所有行對,其中第一個ID與第二個ID不同。實際上,你想要的是ID在一張表中,不在第二個ID中。這是一個不同的問題。

前段時間,AskTom對此進行了一次長期的討論,討論了最有效的方法。如果我記得,事實證明,最有效的方法是UNION ALL這兩個表格(或者僅僅是來自兩個表格的ID,如果這就是你需要的),GROUP BY ID並且只保留那些HAVING COUNT(*) = 1。 (假設,那ID是這兩張表中的主鍵。)

祝你好運!

1

假設你有適當的補助對相關架構所有者

,如果你需要在同一個schema.table不在其他的你可以使用減去例如行選擇:

select S1.ID 
FROM SCHEMA1.DATABASE_UPDATE S1 
minus 
select S2.ID 
SCHEMA2.DATABASE_UPDATE S2 
2

很多方法可以讓兩個表,其中最簡單的爲負的區別

select S1.ID FROM SCHEMA1.DATABASE_UPDATE S1, 
MINUS 
select S2.ID FROM SCHEMA2.DATABASE_UPDATE S2 

您的解決方案創建一個跨產品,其中S1中的每一行匹配到EV在S2中的第二行,其中s2.id與S1.ID不同 - 這是其中大部分。

3

減號是一個很好的解決方案,但我建議在不同的方面做。

select S1.ID 
FROM SCHEMA1.DATABASE_UPDATE S1 
minus 
select S2.ID 
SCHEMA2.DATABASE_UPDATE S2 

select S2.ID 
SCHEMA2.DATABASE_UPDATE S2  
minus 
select S1.ID 
FROM SCHEMA1.DATABASE_UPDATE S1 

其他辦法做到這一點(在一個查詢):

select S1.ID,S2.ID 
FROM SCHEMA1.DATABASE_UPDATE S1 
FULL OUTER JOIN SCHEMA2.DATABASE_UPDATE S2 ON (S1.ID = S2.ID) 
WHERES S1.ID IS NULL OR S2.ID IS NULL; 
0

會是這樣的工作?左連接然後過濾到沒有返回第二個表中的結果的結果。然後如有必要,您可以使用UNION返回相反的結果。

SELECT S1.ID 
FROM SCHEMA1.DATABASE_UPDATE S1 
LEFT JOIN SCHEMA2.DATABASE_UPDATE S2 
WHERE S2.ID IS NULL 
相關問題