2015-01-08 81 views
0

某些記錄我有8個表: received1,received2,received3,received4, recovery1,Recovery2的,recovery3,recovery4SQL排除子查詢

這些表中的每個人都有一個名爲 「項」 字段。

我想要做的是找到接收和恢復之間匹配的所有記錄,但是,如果一個項目在received3中但不在recovery3中,我不想顯示它。

下面是一個例子:收到一個項目,它進入received1,然後有一個恢復,它進入recovery1。如果它停在那裏,我想選擇它。

另一個例子:接收到一個項目,它進入received1,然後有一個恢復,它進入recovery1,再次接收,進入received2,再次恢復,recovery2,然後再次接收,接收3但沒有恢復。我不想選擇這一個,因爲該項目沒有恢復。

編輯:我會更清楚,我想獲得他們最後收到/恢復匹配的項目。如果他們已收到/恢復2次,我想選擇它。但是,如果一個項目已經收到3次並且恢復了2次,我不想選擇它(在這個例子中,在收到的1-2-3中會有一個項目,並且在1-2中有一個恢復,但不是3) 。

+1

只是要明確一點,接收/恢復3或接收的任何元素是唯一的例外,但對於同一個編號的表沒有恢復? – ryanyuyu

+0

你是否也想選擇收到的記錄和恢復1和2如果3丟失或全部排除? – KHeaney

+0

你能否澄清你想要的結果集格式?你想要一個表示每個表的列還是隻需要一列和一列來標識它來自哪個表?還可以添加關係所在的列,即是否存在名爲ItemID的列? – KHeaney

回答

0

從你的例子,它似乎是一個'項目'總是遵循接收恢復接收恢復模式。如果是這種情況,只有在出現兩次的倍數時才能考慮該項目。另外,由於你沒有給出關於表格結構的更多細節,我假定一個'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 
+0

這似乎正是我正在尋找的,我會嘗試它。 – Sibanak

+0

只是試了一下,它不起作用,我不知道爲什麼,它沒有找到任何記錄。 – Sibanak

+0

我刪除了在哪裏條件和第一個選擇,所以我可以看到計數,他們都在1. – Sibanak

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

類似的東西

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

剛剛嘗試過,它不起作用。無論如何,謝謝 – Sibanak