2013-06-05 22 views
0

我有2個表,Table 1和表2,其中兩列兩個表中是相同SQL查詢來從兩個表中的數據與取「未」條件

更新:Table1.col1的類型相同,表2。 col1和Table1.col2與Table2.col2相同

試圖獲取數據,其中table1.col1不在table2.col1和table1.col2不在table2.col2中,這是我的查詢。

select * from Table1 
    where Table1.col1 not in (select Table2.col1 from Table2) 
     and Table1.col2 not in (select Table2.col2 from Table2) 

想知道有什麼更好的辦法,或者這是正確的嗎?

+0

因爲這些表都是一樣的,你不需要把條件對你只需要兩列一個 – Stephan

+0

@ArturUdod將無法正常工作...會給你笛卡兒的產品,除了匹配的值可能你想說'LEFT JOIN'' WHERE col1 IS NULL' – Stephan

+0

@Stephan除了2列以外,兩個表格都非常不同。 – Yogesh

回答

2

這個查詢應該做的工作,我跑了基於查詢一個簡單的測試,並沒有產生預期的結果

SELECT * 
FROM Table1 t1 
LEFT JOIN Table2 t2 
    ON t1.col1 = t2.col1 AND t1.col2 = t2.col2 
WHERE t2.col1 IS NULL AND t2.col2 IS NULL 

鑑於這種

CREATE TABLE Table1 
(
colA VarChar(50), 
col1 Int, 
col2 Int 
) 

CREATE TABLE Table2 
(
colB VarChar(50), 
col1 Int, 
col2 Int 
) 

INSERT Table1 
VALUES ('A', 1, 1), 
     ('B', 1, 2), 
     ('C', 2, 1) 

INSERT Table2 
VALUES ('X', 1, 1), 
     ('Y', 2, 1), 
     ('Z', 2, 2) 

如果我理解你的問題,我們應該得到這個B | 1 | 2

+0

這取決於所需結果的解釋。只需要測試一個null,就好像兩個不匹配那麼它就不會加入。 – Paparazzi

+0

@Blam是的,理由我說如果我正確理解問題,op說'where table1.col1 not in table2.col1' ** and **'table1.col2 not in table2.col21',但他的查詢didn'按照我的預期返回任何記錄集,這很可能是我誤解了這個問題。 – Jason

+0

我同意這個問題並不清楚。 – Paparazzi

2

使用LEFT JOIN:

SELECT Table1.* 
FROM Table1 
LEFT JOIN Table2 
    ON Table1.col1 = Table2.col1 
    AND Table1.col2 = Table2.col2 
WHERE Table2.col1 IS NULL 
+0

一起工作會更好的INNER JOIN與正確的條件? LEFT JOIN的表現並不是最好的。 – Wallack

+0

如果你正在使用'=',那麼是的,但''>'我相信左連接的執行計劃更簡單。可能依賴於DBMS,我沒有研究它,但有點。 –

+0

@Wallack內連接不會識別不匹配的值。 – Paparazzi

0

請評論,如果與此查詢的任何問題:

select * from table1 
where not exists (select 1 from table2 where table2.col1 = table1.col1 and table2.col2 = table1.col2)