2012-08-16 64 views
1

所以我遇到了從我的查詢中獲取正確數據的問題。查詢查找同一表中的差異

我有如下表(人):

Name |  xpath  | value 
Derek | /body/torso/arm | left 
Derek | /body/torso/arm | right 
Derek | /body/torso/neck | Head 
Ron | /body/torso/neck | Head 
Ron | /body/torso/arm | left 

所以基本上查詢結果我正試圖獲得被展示的差異(什麼兩個人之間的丟失)。

results: 
Name1 |  xpath1  | value1 | Name2 | xpath2   | value2 
Derek | /body/torso/arm | right | Ron | NULL   | NULL 

我甚至會被罰款與得到以下背部以及

results: 
Name1 |  xpath1  | value1 | Name2 | xpath2   | value2 
Derek | /body/torso/arm | right | Ron | NULL   | NULL 
Derek | /body/torso/arm | left  | Ron | /body/torso/arm | left 
Derek | /body/torso/neck | Head  | Ron | /body/torso/neck | Head  

查詢我使用是:

SELECT P.Name , P.xpath, P.value, P1.Name, P2.xpath, P3.value 
FROM Person as P 
LEFT OUTER JOIN 
    Person as P2 ON P.xpath = P2.xpath 
WHERE 
     P.Name = "Derek" 
    AND P2.Name = "Ron" 

結果我不斷收到不管我怎麼努力基本上是重疊的數據,但從來沒有找到我真正想要的東西,似乎我缺少一些簡單的東西,或者只是簡單地做錯了。有什麼建議麼?最終我將在SPROC中運行這個,但能夠處理多個名稱不僅僅是2,但如果我有,Derek,Ron,John,Dawn等,我們將很高興。

回答

2

給這個鏡頭:

SELECT a.Name AS Name1, 
      a.xpath AS xpath1, 
      a.value AS value1, 
      'Ron' AS Name2, 
      b.xpath AS xpath2, 
      b.value AS value2 
FROM  Person a 
LEFT JOIN Person b ON b.Name = 'Ron' 
        AND a.xpath = b.xpath 
        AND a.value = b.value 
WHERE  a.Name = 'Derek' AND 
      b.Name IS NULL 

​​


如果你想德里克比較多的名字,你可以做所有名的CROSS JOIN來比較(這樣的名字可以在出現結果集),並且LEFT JOIN使用xpath同桌,value,並在CROSS JOIN指定的名稱:

SELECT  a.Name AS Name1, 
      a.xpath AS xpath1, 
      a.value AS value1, 
      b.Name AS Name2, 
      c.xpath AS xpath2, 
      c.value AS value2 
FROM  Person a 
CROSS JOIN (
      SELECT 'Ron' AS Name UNION ALL 
      SELECT 'John'  UNION ALL 
      SELECT 'Charles'  UNION ALL 
      SELECT 'Aaron' 
      ) b 
LEFT JOIN Person c ON b.Name = c.Name 
        AND a.xpath = c.xpath 
        AND a.value = c.value 
WHERE  a.Name = 'Derek' AND 
      c.Name IS NULL 

SQLFiddle Demo


如果你想在有多個名稱比較的左側(不只是「德里克」),只是改變

a.Name = 'Derek' 

a.Name <> b.Name 
在上面的查詢


SQLFiddle Demo


編輯:只是把它更進一步:

對比所有名稱所有名稱:

SELECT  a.Name AS Name1, 
      a.xpath AS xpath1, 
      a.value AS value1, 
      b.Name AS Name2, 
      c.xpath AS xpath2, 
      c.value AS value2 
FROM  Person a 
CROSS JOIN (SELECT DISTINCT Name FROM Person) b 
LEFT JOIN Person c ON b.Name = c.Name 
        AND a.xpath = c.xpath 
        AND a.value = c.value 
WHERE  a.Name <> b.Name AND 
      c.Name IS NULL 
+0

太棒了!謝謝!我也從來不知道SQLFiddle網站。很有用! – Jtello 2012-08-16 19:45:24

0

嘗試使用EXCEPT工會:

WITH tbl (name, xpath, value) as 
    (values 
     ('Derek','/body/torso/arm','left'), 
     ('Derek','/body/torso/arm','right'), 
     ('Derek','/body/torso/neck','Head'), 
     ('Ron','/body/torso/neck','Head'), 
     ('Ron','/body/torso/arm','left') 
    ) 
SELECT xpath, value 
FROM tbl 
WHERE name = 'Derek' 
    EXCEPT 
     SELECT xpath, value 
     FROM tbl 
     WHERE name = 'Ron'