2014-03-05 128 views
0

這可能是一件非常簡單的事情,但目前我無法弄清楚。SQL連接排除結果

表順序

+----+---------+ 
| id | name | 
+----+---------+ 
| 1 | Order 1 | 
| 2 | Order 2 | 
| 3 | Order 3 | 
+----+---------+ 

表Facturationdetails

+----+----------------+ 
| id |  name  | 
+----+----------------+ 
| 1 | Transportation | 
| 2 | Regular  | 
| 3 | Fixed   | 
+----+----------------+ 

表關係:

表Facturationdetails

+----------+---------+ 
| order_id | fact_id | 
+----------+---------+ 
| 1  | 1  | 
| 1  | 2  | 
| 1  | 3  | 
| 2  | 2  | 
| 2  | 3  | 
| 3  | 2  | 
+----------+---------+ 

現在我想找出該命令沒有fakturationdetails1(運輸)

select to.order_id 
from table_order to 
join table_facturation tf 
on tf.order_id = to.order_id 
where tf.fakt_id != 1 

但是,這將返回所有行:

+---+---+ 
| 1 | 2 | 
| 1 | 3 | 
| 2 | 2 | 
| 2 | 3 | 
| 3 | 2 | 
+---+---+ 

而且我想要的結果是:

訂購2和Order 3.

回答

1

我懷疑你想使用NOT EXISTS,所以不是找到fact_id不是1的行,而是從表中查找訂單,其中fact_id 1,然後排除這些訂單:

SELECT o.order_id 
FROM table_order o 
WHERE NOT EXISTS 
     ( SELECT 1 
      FROM table_facturation tf 
      WHERE tf.order_id = o.order_id 
      AND  tf.fakt_id = 1 
     ); 

您還沒有指定一個DBMS,但如果你正在使用MySQL you will get better performance使用LEFT JOIN\IS NULL

SELECT o.order_id 
FROM table_order o 
     LEFT JOIN table_facturation tf 
      ON tf.order_id = o.order_id 
      AND tf.fakt_id = 1 
WHERE tf.order_id IS NULL; 
+0

就像一個魅力! – seezung

0

一種方式來處理,這是一個left join並在where條款中進行比較。尋找匹配的東西,然後再選擇那些沒有匹配:

select to.order_id 
from table_order to left join 
    table_facturation tf 
    on tf.order_id = to.order_id and 
     tf.fakt_id = 1 
where tf.fakt_id is null; 
+0

測試您的解決方案,回來一秒! – seezung

+0

工程就像一個魅力! – seezung