INTERSECT在特定列上或排除列

时间:2015-04-14 21:18:12

标签: sql

自从我在SQL世界中玩了一段时间后,我可以用一只手试图解决这个问题,因为我还没有找到解决方法。

我有一个查询,我使用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   ....

这些联合很好,但是当我想与另一个查询相交时,我似乎无法找到忽略该列的方法。

我的问题是:如何在进行交叉时忽略列,或仅在指定的列上相交?

注意:我可以将q4合并到每个其他查询中,但这似乎是很多不必要的重复。

1 个答案:

答案 0 :(得分: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

只需在ON的{​​{1}}子句中包含交叉点中涉及的所有列。

以上查询的输出为:

INNER JOIN