2013-05-10 4 views
0

Я пытаюсь построить запрос следующего характера: Если x находится в объединении A и B, но не в объединении C и D, верните x.Множественные утверждения объединения и разность результирующих таблиц

Например:

table table table table 
+---+ +---+ +---+ +---+ 
| A | | B | | C | | D | 
+---+ +---+ +---+ +---+ 
| 1 | | 4 | | 2 | | 3 | 
| 2 | | 5 | | 3 | | 7 | 
| 3 | | 6 | +---+ +---+ 
| 4 | | 7 | 
+---+ +---+ 

Я искал бы это вернуть:

+---+ 
| E | 
+---+ 
| 1 | 
| 4 | 
| 5 | 
| 6 | 
+---+ 

Я пробовал:

SELECT * from A 
union 
SELECT * from B 
WHERE * not in 
(SELECT * from C 
union 
SELECT * from D) 

, но я думаю, что мой синтаксис неверен. Любые советы о том, как решить эту проблему, получили бы высокую оценку.

ответ

1

Я бы написать запрос так:

SELECT * 
FROM A 
WHERE A.ID NOT IN (SELECT ID FROM C) 
     AND A.ID NOT IN (SELECT ID FROM D) 
UNION 
SELECT * 
FROM B 
WHERE B.ID NOT IN (SELECT ID FROM C) 
     AND B.ID NOT IN (SELECT ID FROM D) 

Вы также можете написать это следующим образом:

SELECT * 
FROM 
    (SELECT * FROM A UNION SELECT * FROM B) s 
WHERE 
    ID NOT IN (SELECT ID FROM C UNION SELECT ID FROM D) 

Пожалуйста, см скрипку here. Возможно, вы захотите использовать UNION ALL вместо UNION для удаления дубликатов.

+0

Это сделало трюк. Спасибо! –

2

Попробуйте это:

SELECT u1.col1 
FROM (SELECT col1 from A union SELECT col1 from B) u1 
LEFT OUTER JOIN (SELECT col1 from C union SELECT col1 from D) u2 
ON u1.col1 = u2.col1 
WHERE u2.col1 IS NULL 

Смотрите демо на SQLFiddle.

Запрос выполняет левое внешнее объединение двух результатов объединения и затем фильтрует из тех, которые отсутствуют в одном из результатов объединения.

+0

Thanks @Aziz. Я уверен, что это было бы трюком, но другой ответ мне был легче понять. –

1

Команда «union» является разделителем запросов. Это означает, что прежде всего это запрос, и что происходит после него - это другой запрос. В результате предложение WHERE будет применяться только к второму запросу (SELECT * from B).

В зависимости от вашей платформы SQL вы можете скопировать предложение WHERE до UNION, чтобы оно применимо к обоим запросам. Кроме того, вам может потребоваться использовать JOIN или EXCEPTION JOIN или EXISTS, чтобы получить то, что вы хотите.

+0

Благодарим за информацию. –