2012-10-26 40 views
0

我有如下表:SQL数据检索的问题

订购

Order_id  orde_number Order_name 

1    12345   iphone 

2    67891   samsung 

order_event

order_event_no  status 

1     D 

1     C 

2     C 

我写了下面的查询检索status not in ('D')像下面,但它给了我2记录, 但查询不应该返回,因为order_no 1已经作为状态D,即使它有第二个记录C它不应该包括。

select o.order_number,o.order_name 
    from order o 
    join order_event oe 
    on (o.order_id=oe.order_event_no) where oe.status not in ('D') 

问候, Chaitu

+0

'order_event.status'是强制性列吗? – APC

回答

1

这将完成你想要与你定模式/数据什么...

SELECT order_number, order_name 
FROM order 
WHERE order_id NOT IN (SELECT order_event_no FROM order_event WHERE status = 'D') 
+0

好的,明白吧! ;-) – danihp

+0

@JIm:谢谢,是否会导致任何性能问题? – user1726550

+0

使用子查询可能会影响性能,具体取决于您的DBMS,您拥有的索引以及数据的大小。但是你想要针对其他解决方案介绍解释计划。我会提供一个可以测试性能的替代方案,作为对我的答案的编辑。 – Jim

0

如果要排除谁拥有像'状态的任何命令D'你需要一个子查询。

select o.order_number,o.order_name 
from order o 
where oe.order_event_no 
NOT IN 
    (SELECT order_event_no FROM order_event_no WHERE status = 'D') 
0

这是等同的。一些RDBM将更快地执行它:

Select 
    o.order_number, 
    o.order_name 
from 
    order o 
where 
    not exists (
    select 
     'x' 
    from 
     order_event oe 
    where 
     oe.order_event_no = o.order_id And 
     oe.status = 'D' 
);