2008-12-24 69 views
0

我檢索三個不同的數據集(或什麼應該是「唯一」行)。總的來說,我期望3個不同的唯一行集合,因爲我必須在每組數據上完成不同的操作。但是,我在表中檢索的行數多於總數,這意味着我必須在某處檢索重複的行。下面是我的三套查詢的例子:查詢三個非等分數據集

SELECT DISTINCT t1.* 
    FROM table1 t1 
    INNER JOIN table2 t2 
     ON t2.ID = t1.ID 
      AND t2.NAME = t1.NAME 
      AND t2.ADDRESS <> t1.ADDRESS 


SELECT DISTINCT t1.* 
    FROM table1 t1 
    INNER JOIN table2 t2 
     ON t2.ID = t1.ID 
      AND t2.NAME <> t1.NAME 
      AND t2.ADDRESS <> t1.ADDRESS 


SELECT DISTINCT t1.* 
    FROM table1 t1 
    INNER JOIN table2 t2 
     ON t2.ID <> t1.ID 
      AND t2.NAME = t1.NAME 
      AND t2.ADDRESS <> t1.ADDRESS 

正如你所看到的,我選擇(在查詢的順序)

  • 組數據,其中ID和名稱匹配
  • 設置數據,其中的ID相匹配的,但名稱不
  • 組,其中ID不匹配數據,但名稱不

我一個m檢索比T1中存在的更多的行時,將所有三個查詢返回的結果數加起來,我認爲這在邏輯上是不可能的,此外,這意味着我必須重複行(如果這在邏輯上是可能的),在某處阻止我對每一組執行不同的命令(因爲一行將會執行另一個命令)。

有人能找到我要去的地方嗎?

+0

它可能有助於解釋你在做什麼,爲什麼我看着這個,並認爲'wtf你在做什麼?' – cletus 2008-12-24 20:35:42

回答

2

考慮如果名稱不是唯一的。如果有以下數據:

Table 1      Table 2 
ID Name  Address  ID Name  Address 
0  Jim Smith 1111 A St  0  Jim Smith 2222 A St 
1  Jim Smith 2222 B St  1  Jim Smith 3333 C St 

然後查詢1爲您提供:

0  Jim Smith 1111 A St 
1  Jim Smith 2222 B St 

因爲行於表1匹配的行1 & 2,分別在表1 & 2 2.

查詢2沒有給你任何東西。

查詢3給你

0  Jim Smith 1111 A St 
1  Jim Smith 2222 B St 

由於在表1中第1行匹配於表2和行2在表1中第2行於表2中匹配行1這樣你可以獲得4行出表1的時它只有2行。

+0

這些地址看起來像他們匹配。所有人都不會有零結果嗎? – recursive 2008-12-24 20:58:35

1

您確定NAME和ID在兩個表中都是唯一的嗎?

如果沒有,你可以有一種情況,例如,在表1中有這樣的:

名稱:弗雷德 ID:1

和表2具有這樣的:

名稱:弗雷德 ID:1

NAME:佛瑞德 ID:2

在這種情況下,在記錄table1將由您的兩個查詢返回:ID和NAME都匹配,並且NAME匹配但ID不匹配。

您可能能夠通過兩個查詢的每個組合交叉來縮小問題,找出重複的是什麼,例如:

SELECT DISTINCT t1.* 
    FROM table1 t1 
    INNER JOIN table2 t2 
     ON t2.ID = t1.ID 
       AND t2.NAME = t1.NAME 
       AND t2.ADDRESS <> t1.ADDRESS 
INTERSECT 
SELECT DISTINCT t1.* 
    FROM table1 t1 
    INNER JOIN table2 t2 
     ON t2.ID = t1.ID 
       AND t2.NAME <> t1.NAME 
       AND t2.ADDRESS <> t1.ADDRESS 
+0

在任一表中,名稱和ID都不是唯一的,這是使用Intersect後發現的確切情況。表1有一個匹配的「唯一」值,但表2有兩個可能的回報。我在每個表格中都有一個獨特的價值(我基本上把兩張相似的表格拼成一張),我想我可以使用它。 – Organiccat 2008-12-24 20:59:25

0

我想最後的查詢可能是一個獲取額外的組行。

即正是依靠在兩個表中名稱匹配(而不是ID)

1

假設T2.ID具有唯一約束,它仍然是相當邏輯上可能爲這個場景occur.If在T1每個記錄,也有T2兩個相應的記錄:

  1. 相同的名字,同一ID,不同的地址
  2. 相同的名稱,不同的ID,不同的地址

那麼對於T1相同的記錄能拿出在例如第一和第三個查詢。

也可以在第二個和第三個查詢中同時獲取同一行。

如果T2.ID不能保證是唯一的,那麼你可以在T1的所有三個查詢中得到相同的行。

0

要找到有問題的數據(並幫助找到你的邏輯洞),我會建議:

(慎用僞代碼)

限制結果只選擇ID FROM ....

  • UNION結果集

  • COUNT(ID)

  • GROUP BY ID

  • HAVING數量(ID)> 1

這將顯示匹配多於一個子查詢的記錄。