2017-04-11 32 views
2
table1   table2    table3   Expected Result 
-------------  --------------  ------------- ------ 
| id | col1 |  | id | col1 |  | id | col1 | | id | 
-------------  --------------  ------------- ------ 
| 1 | val1 |  | 2 | val1 |  | 3 | val1 | | 1 | 
| 2 | val2 |  | 2 | val2 |  | 3 | val2 | | 6 | 
| 3 | val3 |  | 4 | val1 |  | 5 | val1 | ------ 
| 4 | val4 |  | 4 | val2 |  | 5 | val2 | 
| 5 | val5 |  --------------  ------------ 
| 6 | val6 | 
------------- 

我想選擇不在table2和table3中的table1的id。爲此,我寫了一個查詢,但執行時間太長。請給我一個更好的查詢。選擇兩個表中不存在的值

我已經使用的查詢是 SELECT DISTINCT(id) FROM table1 WHERE yacht_id NOT IN (SELECT id FROM table2 UNION SELECT id FROM table3 ORDER BY id)

+2

你可以嘗試加入,然後基本上選擇在連接是空的所有值。 –

回答

2

您所查詢的是好的,但更好的方法是使用left join小號

select t1.id 
from table1 t1 
left join 
     table2 t2 
on  t1.id = t2.id 
left join 
     table3 t3 
on  t1.id = t3.id 
where t2.id is null and t3.id is null 

這將保留從table1所有行,與null小號匹配他們的時候了id在table2table3上不可用。

從那裏你所要做的就是過濾table2table3上的null行。

1

爲什麼不試試兩個獨立的IN子句

SELECT id 
FROM table1 
WHERE yacht_id NOT IN (SELECT id FROM table2) 
    OR yacht_id NOT IN (SELECT id FROM table3) 
2
SELECT * FROM table1 a 
LEFT JOIN table2 b on a.id = b.id 
LEFT JOIN table3 c on a.id = c.id 
WHERE b.id is null and c.id is null 

你可以試試這個

+0

難道你不是說......'LEFT JOIN table3 c'? – butterFlyNick