2012-10-26 69 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' 
);