2014-01-14 1181 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)