2013-01-11 89 views
0

我有一些信息,其中IdNumbers(不是主鍵ID,只是隨機ID分配給個人)並不總是正確的在我的第一個表。加入((=陳述)或((!=陳述),其他規定))

因此,我正在加入我的第二個表和ID,並試圖讓它到達名稱的位置,只有當IdNumbers不匹配時。

我正在使用大致如下的連接語句處理查詢(我忽略了SELECT,WHERE和ORDER BY節,因爲我相信它們對此問題沒有影響,而我不要混淆,因爲它們很愚蠢複雜 - 如果下面的查詢部分應該像我想要的那樣工作,並且問題顯然是在其他地方,那麼請告訴我,那樣會回答我的問題):

FROM Table1 
FULL OUTER JOIN Table2 ON ((Table1.IdNumber = Table2.IdNumber) 
OR (Table1.IdNumber != Table2.IdNumber 
    AND Table1.Lname = Table2.Lname 
    AND Table1.Fname = Table2.Fname)) 

但是,多次參加誰擁有兩個匹配ID的人相匹配的名字,像這樣:

Fname M Lname Table1.IdNumber Table2.IdNumber2 
Matthew - Smith 1    2 
Matthew H Smith 2    1 
Matthew - Smith 1    1 
Matthew H Smith 2    2 

因此,它是拉最後2個,因爲他們的ID匹配,但也加入了前兩個,因爲他們的ID不匹配,他們的名字相匹配,但爲什麼它加入前2?我懷疑它在決定何處加入時忽略了!=語句,因爲其他條件已滿足,但我希望它以某種方式考慮這個!=語句。

如果這應該工作,就像我之前說過的,告訴我,它會回答我的問題。

(*編輯) 對不起,我應該正確命名這些 - 我修改了名稱。而完整的外部連接是必要的,我需要從這兩個表中的一切,不管它是什麼,它的工作正常,但謝謝你的建議。

+2

請出示哪些列屬於哪個表。順便說一句:你確定你想要一個完整的外部連接而不是一個內部連接? –

+0

在你的例子中,這些全部看起來都是獨特的記錄。你能給我們提供一個小提琴嗎? – Woot4Moo

+0

它考慮了'!=' - 在結果的第一行,'1!= 2'。你需要某種類型的'NOT EXISTS'作爲ID的匹配行,但不幸的是這將比你當前的'JOIN'複雜得多。 – cjk

回答

0

考慮如何凌亂,這將是做一個連接,我會建議使用臨時表來保存關係。

您可以將第一張表中的所有ID插入臨時表中,然後執行兩次更新保存第二張ID的列 - 第一次使用ID匹配的位置,第二次ID不匹配匹配但名字確實。

然後,您可以使用此表來連接兩個表,表1從表2檢索最多一個記錄,每個記錄

+0

謝謝,你說服我不要嘗試使用連接,並把我放在正確的軌道上,直到臨時表。我使用了類似於你的建議的東西:DELETE FROM table2 WHERE EXDSTS (select tableNumber from table1 where table1.IdNumber = table2.Idnumber)and with more more steps got got what's I wanted。謝謝 :) – JackArbiter

0

我想你想是這樣的:

select t1.*,t2.* 
from t1,t2 
where t1.id = t2.id 
and t1.name = t2.name 
union 
select t1.*,t2.* 
from t1,t2 
where t1.id ! t2.id 
0

您的查詢應該工作,如果列從右側的表來。因爲你沒有使用表別名,我懷疑你有一個表達式,例如:

fname1 = fname2 

並且兩列在同一個表中。或更糟糕的是:

fname1 = fname1 

這基本上總是TRUE(除非fname1不爲空)。

您的查詢可能有效,但在大多數數據庫中效率不高,因爲它們將使用嵌套循環優化。考慮重寫查詢爲:

from table1 t1 full outer join 
    table2 byID 
    on t1.IdNumber = byID.IdNumber full outer join 
    table2 byName 
    on t1.fname = byName.fname and t1.lname = byName.lname and t1.idNumber <> byName.idNumber 

這將需要改變其他條款在您的查詢,通常喜歡的東西:

coalesce(byId.column, byName.column) as Column 
+0

是的,對不起,我弄糟了名字(我修改了它們的名字),我的意思是要表明它們來自表1和表2,但當然這根本不是我剛纔提出的問題: ) – JackArbiter