2014-03-05 126 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