2014-01-14 1225 views
0

我想要做的是相互匹配行並排除所有匹配多個時間的行。SQL顯示不重複的行LEFT JOIN

SQLFiddle

數據集(請記住,這是簡化和有我需要從查詢檢索更多的信息)

表1:

NAME PART1  PART2 

ABC  FirstABC SecondABC 
BAC  FirstBAC SecondBAC 
BAC  SecondBAC FirstBAC 
CBA  FirstCBA SecondCBA 
DAE  FirstDAE SecondDAE 
EDA  FirstEDA SecondEDA 

表2:

ITEM1  ITEM2 

FirstABC SecondABC 
FirstBAC SecondBAC 
FirstBAC SecondBAC 
FirstCBA SecondCBA 
FirstDAE SecondDAE 
FirstEDA SecondEDA 

我到目前爲止有:

SELECT * 
FROM TOMATCH as T 
LEFT JOIN AGAINST as A 
ON (
    T.Part1 = A.Item1 
    OR T.Part2 = A.Item1 
    OR T.Part1 = A.Item2 
    OR T.Part2 = A.Item2 
) 

我在尋找什麼結果:

NAME PART1  PART2  ITEM1  ITEM2 

ABC  FirstABC SecondABC FirstABC SecondABC 
CBA  FirstCBA SecondCBA FirstCBA SecondCBA 
DAE  FirstDAE SecondDAE FirstDAE SecondDAE 
EDA  FirstEDA SecondEDA FirstEDA SecondEDA 
+0

怎麼樣SELECT DISTINCT? –

+0

理想的結果尚不清楚。什麼是重複的?使用'DISTINCT',你會得到[this](http://sqlfiddle.com/#!6/87dc5/4/0),這是不同的結果。 **編輯**你有主鍵嗎? –

+0

想要的結果是排除重複的結果(如果我沒有理解的話)。獨特將避免重複,但顯示數據「哪些將被複制而沒有明顯的」。 –

回答

0

你能夠通過各個領域的小組,並添加一個having子句與數= 1

SELECT name, part1, part2, item1, item2 
FROM TOMATCH as T 
LEFT JOIN AGAINST as A 
ON (
T.Part1 = A.Item1 
OR T.Part2 = A.Item1 
OR T.Part1 = A.Item2 
OR T.Part2 = A.Item2 
) 
group by name, part1, part2, item1, item2 
having count(*) = 1 

看到SqlFiddle

+0

但並不完全是OP想要的,我假設他想要找到兩次與「ON」子句不匹配的所有行。樣本數據不是最佳的。 –

+0

@TimSchmelter好,理想的結果看起來像我的結果...(這就是我所理解的,當然這可能是錯誤的) –

+0

@TimSchmelter是正確的。正如我所提到的,這是數據集的簡化版本,實際上有20列,但只有4列進行匹配。 – skmasq

0

過濾ŧ他在加入TOMATCH之前從AGAINST中複製出來。

UPDATE t 
    SET UniqueMatch = ItemNumber 
FROM TOMATCH t 
INNER JOIN (
    SELECT Item1, Item2, MIN(ItemNumber) AS ItemNumber 
    FROM AGAINST 
    GROUP BY Item1, Item2 
    HAVING COUNT(*) = 1 
) a ON (Item1 = Part1 AND Item2 = Part2)