2014-02-26 24 views
0

我使用SQL Server 2008數據庫。如何從表A中查找不存在於表B中的記錄?

我有兩個表的列這樣的:

Table A

request_id|order_id|e-mail 
100  |2567 |[email protected] 
100  |4784 |[email protected] 
450  |2578 |[email protected] 
450  |8432 |[email protected] 
600  |9032 |[email protected] 
600  |9033 |[email protected] 

Table B也已經idorder_no列和許多其他列:

Table B

request_id|order_id|e-mail 
100  |2563 |[email protected] 
300  |4784 |[email protected] 
600  |9032 |[email protected] 
650  |2578 |[email protected] 
850  |8432 |[email protected] 

正如你所看到的,在表A中給定的request_id可以出現不止一次(見100 & 450條記錄)

我需要找到從表格中的所有記錄,它通過order_id不存在於表B,但有相同的request_id列值。

對於上面的例子,我希望這樣的事情:

Output

request_id|order_id|e-mail 
100  |2567 |[email protected] 
100  |4784 |[email protected] 
450  |2578 |[email protected] 
450  |8432 |[email protected] 
600  |9033 |[email protected] 

正如你可以看到從上面的表格中的記錄不存在於表B.此標準是僅僅滿足於記錄下order_id=600

我創建了T-SQL查詢的草圖:

select 
    D.request_id, D.order_id 
from 
    table A AS D 
where 
    D.request_id = 600 
    and D.order_id not in (select M.order_id 
          from table B AS M 
          where M.request_id = 600) 

不幸的是,我不知道如何轉換我的查詢所有request_id。第一個想法是使用while循環遍歷表A中的所有request_id,但在SQL世界中似乎並不聰明。

感謝您的幫助

回答

2

試試這個 -

SELECT a.* 
FROM  table_a a 
LEFT JOIN table_b b ON a.request_id = b.request_id 
        AND a.order_id = b.order_id 
WHERE b.request_id IS NULL 

檢查h ERE - SQL Fiddle

+0

謝謝。目前我無法用真實的例子來測試它,但它似乎起作用!一個問題:我是否將最後一個WHERE條件更改爲「WHERE b.order_id IS NULL」?我發現它也可以工作,對我來說似乎更舒服,因爲我想查找所有不匹配的request_id :) – Viper

+0

因爲在JOIN子句中使用了兩個列('request_id'和'order_id')你不需要它。這是同一件事。 – AgentSQL

+0

也許我錯誤理解了這個要求,但我認爲OP在說他希望所有在表B中有與request_id上的表A匹配的記錄但不是order_id上的記錄的情況。上面的查詢將列出來自表A的記錄,這些記錄在request_id或order_id上的表B中沒有匹配。 – Jay

2
select request_id, order_id from table_a 
except 
select request_id, order_id from table_b 

編輯:這並不在MS SQL工作:

如果你想要的電子郵件地址,以及:

select request_id, order_id, email from table_a 
where (request_id, order_id) not in (
    select request_id, order_id from table_b 
) 
+2

在MS SQL中,您需要使用'EXCEPT'而不是'minus'。語法在其他方面是相同的。我不相信在T-SQL中的第二種方法。您也可以在主鍵上執行'table_a LEFT JOIN table_b',然後在WHERE table_b中執行。 IS NULL'。 –

+0

@BaconBits我不明白你的第二個解決方案的線索。在這種情況下,primary_key是什麼意思?它是request_id嗎?恕我直言,在左外連接我只能匹配表與一個條件,所以我可以通過request_id和order_id匹配?謝謝 – Viper

+0

@Viper AgentSQL的答案就是我所想的。 –

0
SELECT request_id, order_id,e-mail 
    FROM table_a 
    EXCEPT 
    SELECT request_id, order_id,e-mail 
    FROM table_b 
0

我不知道你是什麼意思「但具有相同的REQUEST_ID列值」。等於什麼?

如果你只是想在表-A沒有在表-B的記錄相匹配REQUEST_ID和ORDER_ID,那麼所有的記錄:

select a.request_id, a.order_id 
from table_a a 
where not exists (select * from table_b b where b.request_id=a.request_id 
    and b.order_id=a.order_id) 
+0

這也使O.P.s問題陳述失敗。 –

+0

正如我在本文開始時所說的,我認爲OP需要澄清他的問題陳述。我相信上述查詢將給出OP在給定的輸入時列出的預期輸出。 – Jay

-1

樓主的問題陳述了(我引述):

我需要查找來自表A的所有記錄, ,這些記錄在order_id, 中不存在於表B中,但具有相同的request_id列值。

有關SQL的事情是,是有從

  • 集理論強大的數學基礎,並
  • 謂詞演算

因此,OP的問題陳述可以簡單地重新標準SQL,幾乎原樣:

select *         -- select all rows 
from A a         -- from table A 
where exists (        -- * that have at least one matching 
     select *       -- row in B with the same request ID 
     from B b       -- 
     where b.request_id = a.request_id -- 
    )          -- 
    and not exists (       -- * but have no matching row in B 
     select *       -- with the same 
     from B b       -- request AND order IDs 
     where b.request_id = a.request_id -- 
      and b.order_id = a.order_id  -- 
    )          -- 

簡單!

+0

返回值是否與預期輸出一致?我不這麼認爲。看看他的'OUTPUT'。 – AgentSQL

相關問題