2011-07-07 79 views
19

我有兩個表看起來像這樣:如何連接兩個表,但只返回不匹配的行?

T1: ID | Date | Hour | Interval 
T2: ID | Date | Hour 

我基本上需要加入這些表時,它們的ID,日期和時間匹配。但是,我只想返回表1的結果,即而不是與表2中的結果相匹配。

我知道這看起來很簡單,但是我被卡住的地方是有多行在表1中與表2相匹配(任何給定小時有多個間隔)。我需要返回所有這些間隔的,只要他們沒有在桌子上掉下來一樣小時內2

示例數據:

T1: 1 | 1/1/2011 | 1 | 1 
    1 | 1/1/2011 | 1 | 2 
    1 | 1/1/2011 | 2 | 1 
    1 | 1/1/2011 | 2 | 2 

T2: 1 | 1/1/2011 | 1 

我預期的結果爲這個設定是最後兩行從T1。任何人都可以在正確的軌道上指點我嗎?

回答

50
SELECT T1.* 
    FROM T1 
    WHERE NOT EXISTS(SELECT NULL 
         FROM T2 
         WHERE T1.ID = T2.ID 
          AND T1.Date = T2.Date 
          AND T1.Hour = T2.Hour) 

它也有LEFT JOIN來完成:

SELECT T1.* 
    FROM T1 
     LEFT JOIN T2 
      ON T1.ID = T2.ID 
       AND T1.Date = T2.Date 
       AND T1.Hour = T2.Hour 
    WHERE T2.ID IS NULL 
+0

感謝您的答覆,兩種查詢都可以很好地與MS Access配合使用說實話,我從來不知道你可以結合像這樣的SELECT語句,+1。 – Breakthrough

+0

實際上,還有一個響應 - 我帶着第一個選項「WHERE NOT EXISTS」條款去了。巧妙的,我從來不知道你可以做到這一點,它運作得非常好。 – Breakthrough

+6

請記住,NOT EXISTS沒有被Jet/ACE查詢處理器優化,並且不會總是在比較的兩邊都使用索引(NOT IN的情況也是如此,達到更大的程度)。因此,隨着數據集的增長,您可以看到NOT EXISTS版本的主要性能受到影響。 JOIN版本將始終使用所有可用的索引。 –

20

使用LEFT JOIN並篩選出具有非NULL T2列線:

SELECT T1.* FROM T1 LEFT JOIN T2 ON T1.ID = T2.ID 
    AND T1.Date = T2.Date AND T1.Hour = T2.Hour 
    WHERE T2.ID IS NULL 
+0

+1,謝謝你的回答,但我不得不和喬一起去(他回答了幾分鐘)。 – Breakthrough

相關問題