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

时间:2015-01-08 19:51:11

标签: sql sql-server join

我有8张桌子:     收到1,收到2,收到3,收到4,     recovery1,recovery2,recovery3,recovery4

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

我想要做的是查找收到和恢复之间匹配的所有记录,但是,如果某个项目在receive3但不在recovery3中,我不想显示它。

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

另一个例子:收到一个项目,它进入receive1,然后有恢复,它进入恢复1,再次接收,进入receive2,再次恢复,恢复2,然后再次接收,收到3但没有恢复。我不想选择这个,因为该项目没有恢复。

编辑:我会更清楚,我想得到他们上次收到/恢复的项目。如果他们已经收到/恢复2次,我想选择它。但是,如果一个项目已经被收到3次并且被恢复了2次,我不想选择它(在这个例子中,将在收到的1-2-3中有一个项目,并且在1-2但不是3中恢复)

3 个答案:

答案 0 :(得分:0)

你可以做的是左外连接表和你的where子句中添加排除你不想要的记录的条件,例如

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

像这样的东西

答案 1 :(得分:0)

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 
.
.
.
.......

答案 2 :(得分:0)

从你的例子来看,它似乎是一个'项目'始终遵循receive-recover-receive-recover模式。如果是这种情况,则只有当项目出现两次的倍数时才能考虑该项目。此外,由于您没有提供有关表结构的任何进一步细节,我假设一个'项目'不重复。在这种情况下,以下查询将为您提供所需的。

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