2015-04-14 4 views
0

Прошло некоторое время с тех пор, как я играл в SQL-мире, и я мог бы использовать руку, пытающуюся решить эту проблему, поскольку мне еще не удалось разобраться, как это сделать ,INTERSECT на конкретном столбце или исключая столбец

У меня есть запрос, где я соединяющие много результатов, используя UNION и удаление с помощью INTERSECT, таких как:

(query 1 
UNION 
query 2 
UNION 
query 3) 
INTERSECT 
query 4 

Моей проблема заключается в том, что у меня есть вычисляемый столбец в каждом из запросов 1-3, что обозначает, из какого запроса они пришли.

т.е.

col 1 | col 2 | col3 .... 
q1 | A | B .... 
q2 | A | D .... 
q3 | E | D .... 

Объединение этих хорошо, но когда я хочу, чтобы пересечь его с другим запросом я не могу найти способ, чтобы игнорировать этот столбец.

SO мой вопрос: Как я могу игнорировать столбец при пересечении или пересекать только указанный столбец?

ПРИМЕЧАНИЕ. Я мог бы включить q4 в каждый из других запросов, но это похоже на много ненужного дублирования.

ответ

1

Вы можете использовать INNER JOIN вместо INTERSECT:

SELECT q.col1 AS uQ, x.col1 AS iQ, q.col2, q.col3 
FROM 
(
SELECT * FROM (VALUES ('q1', 'A', 'B')) q(col1, col2, col3) 
UNION 
SELECT * FROM (VALUES ('q2', 'A', 'D')) q(col1, col2, col3) 
UNION 
SELECT * FROM (VALUES ('q3', 'E', 'D')) q(col1, col2, col3) 
) AS q(col1, col2, col3) 
INNER JOIN (VALUES ('q4', 'E', 'D')) AS x(col1, col2, col3) 
ON q.col2 = x.col2 AND q.col3 = x.col3 

Просто включите в оговорке INNER JOIN всех столбцов, участвующих в пересечении ON.

Вывод из выше запроса:

uQ iQ col2 col3 
=================== 
q3 q4 E  D 
+0

В моем примере выше я упростил запросы для удобства чтения, но запросы содержат различные соединения, где пункты и подпункты запросы. и если я понимаю правильно, вы не можете использовать соединение после WHERE? – Calum

+1

@Calum Вы можете попробовать подставить все запросы операции UNION с вашими реальными запросами. Результатом этой операции UNION является только производная таблица с 'q (col1, col2, col3)' как псевдоним. Затем вы можете выполнить «INNER JOIN» все равно. –

+0

спасибо за совет, я внедрил его, используя метод INNER JOIN, и он работает, но в результате его читаемость пострадала. Поэтому для мешка нескольких повторяющихся строк я, вероятно, придерживаюсь лучшей читаемости – Calum

Смежные вопросы