簡體   English   中英

SQL排除子查詢中的某些記錄

[英]SQL exclude certain records in subquery

我有8個表:received1,receive2,receive3,receive4,recovery1,recovery2,recovery3,recovery4

這些表中的每一個都有一個名為“ Item”的字段。

我想做的是找到在接收和恢復之間具有匹配項的所有記錄,但是,如果某項在receive3中但不在recovery3中,則我不想顯示它。

這是一個示例:接收到一個項目,將其放入Received1,然后進行恢復,該項目將進入recovery1。 如果它停在那里,我要選擇它。

另一個例子:一個項目被接收,進入received1,然后有一個恢復,它進入recovery1,再次被接收,進入received2,再次恢復,recovery2,然后再次被接收,received3,但是沒有恢復。 我不想選擇此商品,因為該商品無法恢復。

編輯:我會更清楚,我想獲得他們最近一次接收/恢復匹配的項目。 如果它們已被接收/恢復2次,我想選擇它。 但是,如果某項目已收到3次並恢復2次,則我不想選擇它(在此示例中,received1-2-3中有一項,而1-2中有一項恢復,但3中沒有。) 。

您可以做的是讓表保持外部連接,並在where子句中添加排除不想要的記錄的條件,例如

SELECT  ...
FROM received1 left outer join received1 on (received1.item = received1) 
     left outer joing on received2 etc...
WHERE received1 != null OR received2 != null ...

像這樣

SELECT * FROM  received1
WHERE EXISTS(SELECT 1 
             FROM  recovery1
             WHERE received1.time = received1.Item)
UNION ALL 
SELECT * FROM  received2
WHERE EXISTS(SELECT 1 
             FROM  recovery2
             WHERE received2.time = received2.Item)
UNION ALL 
.
.
.
.......

從您的示例來看,似乎“項目”始終遵循接收-恢復-接收-恢復模式。 在這種情況下,只有出現兩次的倍數時,才可以考慮該項目。 另外,由於您沒有提供有關表結構的更多詳細信息,因此我假設“項目”不會重復。 在這種情況下,以下查詢將為您提供所需的信息。

SELECT Item FROM
(
(SELECT Item, Count(*) Cnt FROM 

(SELECT Item FROM Received1
UNION ALL
SELECT Item FROM Received2
UNION ALL
SELECT Item FROM Received3
UNION ALL
SELECT Item FROM Recovered1
UNION ALL
SELECT Item FROM Recovered2
UNION ALL
SELECT Item FROM Recovered3)A  GROUP BY Item)B
WHERE Cnt%2 = 0 --checks for multiples of 2

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM