SQL 排除子查询中的某些记录

SQL exclude certain records in subquery

我有 8 张桌子: 收到1,收到2,收到3,收到4, 恢复 1、恢复 2、恢复 3、恢复 4

这些表中的每一个都有一个名为 "Item" 的字段。

我想做的是找到所有在 received 和 recovery 之间匹配的记录,但是,如果一个项目在 received3 但不在 recovery3 中,我不想显示它。

这是一个示例:收到一个项目,它进入 received1,然后有一个恢复,它进入 recovery1。如果它停在那里,我想 select 它。

再举个例子:收到一件东西,进received1,然后recovery,进recovery1,再received,进received2,再recovery,recovery2,再received,received3,没有recovery。我不想 select 这个,因为该项目没有恢复。

编辑:我会更清楚,我想得到他们最后 received/recovery 匹配的项目。如果他们已经received/recovered 2次了,我要select了。但是,如果一个项目已经收到 3 次并恢复了 2 次,我不想 select 它(在这个例子中,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 
.
.
.
.......

从您的例子看来,'item' 总是遵循接收-恢复-接收-恢复模式。如果是这样的话,一个项目只有出现两次的倍数才能被考虑。此外,由于您没有提供有关 table 结构的任何进一步详细信息,我假设 'item' 不会重复。在这种情况下,下面的查询将为您提供所需的信息。

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