2015-10-23 128 views
-1

我有購買表,其中有字段購買ID,收到,itemid和一些其他領域。基於哪裏條件選擇查詢

採購訂單有多個行項目。當您第一次創建採購訂單時,每個行項目的接收字段將爲0.在接收項目時,接收的行項目字段將更改爲1.我只想選擇所有行項目的接收字段都爲0的記錄。例如

Pono received itemid 
100  0   1 
100  0   2 
100  1   3 
100  0   4  
101  0   1 
101  0   5 
101  0   3 

101  0   6 

這裏PONO 100具有。自的itemid 3已經收到= 1我想排除從選擇語句的PONO 100 4個項目。 我想只選擇那些所有的行項目已收到= 0

回答

0

我相信你是在所有記錄中所有行的PO編號爲0的所有記錄的詳細信息。首先生成一組PONO數據,其中任何收到= 1,然後從您的基本集合中選擇它不存在於您生成的集合中的數據。

SELECT PONO, Received, ItemID 
FROM tableName T1 
WHERE not exists (SELECT 1 
        FROM tablename T2 
        WHERE received=1 
        and T1.PONO=T2.PONO) 

SELECT PONO, Received, ItemID 
FROM tableName T1 
WHERE PONO not in (SELECT Distinct PONO 
        FROM tablename T2 
        WHERE received=1) 

或者

SELECT PONO, Received, ItemID 
    FROM tableName T1 
    LEFT JOIN (SELECT Distinct PONO 
         FROM tablename 
         WHERE received=1) T2 
     on T1.PONO = T2.PONO 
    where T2.PONO is null 

每個人都有取決於索引和數據統計顯示,使他們都將執行不同的不同的表現。

+0

非常感謝您的快速響應。 – anu

+0

請注意,這些查詢將返回重複的行。我不知道這是否可取。 –

1

select Pono from <tablename> where received=0

select * from <tablename> where received=0

你問都僅用於PONO和整個記錄,這些都將執行兩個PONO的這些請求分別。

+0

上面的語句選擇我要排除PONO = 100 PONO 100,因爲它有收到= 1 – anu

+0

這絕對不是你的原始請求明確的一個項目。有很多方法可以做到這一點。最大值,總和,不在子查詢中,等等。 –

2

所以,如果我理解正確的,你正在尋找只選擇那些字段從哪裏接到總爲0

您需要執行與having子句分組。

select Pono from <tablename> group by PONO having max(received)=0 
+0

但是,我比'sum()'更喜歡'max()'。 –

+0

同意。這將比總和開銷少。 –

+0

。 。真的,他們在努力方面差不多(除非數據庫使用的是非本地數字格式)。我只是覺得'max()'在意圖上更清晰。 –