自从我在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合并到每个其他查询中,但这似乎是很多不必要的重复。
答案 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