我可以在两个 table 之间的 INTERSECT 运算中得到重复的结果(来自一个 table)吗?
Can I get duplicate results (from one table) in an INTERSECT operation between two tables?
我知道这个问题的措辞很别扭,但我找不到更好的措辞了。让我解释一下情况。
table A
有一堆列(a
、b
、c
...)和我 运行 一个 SELECT
查询,像这样:
SELECT a FROM A WHERE b IN ('....')
(省略号表示要匹配的值数)
还有一个 table B
有一堆列 (d
, e
, f
... ) 我 运行 一个 SELECT
查询,像这样:
SELECT d FROM B WHERE f = '...'
(省略号表示要匹配的单个值)
现在我应该在这里说,两个 table 存储关于同一实体的不同类型的信息,但是列 a
和 d
包含完全相同的数据(在在这种情况下,一个 ID)。我想找出两个 table 的交集,所以我 运行 这个:
SELECT a FROM A WHERE b IN ('....') INTERSECT SELECT d FROM B WHERE f = '...'
问题来了:
第一个 SELECT
包含 WHERE
子句中的一组值,对吗?所以假设集合是 (1234
, 2345
,3456
)。现在,当 b
仅与 1234
匹配时,此查询的结果是 abc
。假设它与 2345
匹配时,它是 def
。与 3456
匹配,得到 abc
。
假设这两个结果(abc
和 def
)也在第二个 SELECT
.
的结果集中
所以,现在,将要匹配的整组值放回到 WHERE
子句中,INTERSECT
操作将得到 abc
和 def
。但是我想要 abc
两次,因为 WHERE
子句中的两个值与第二个 SELECT
.
匹配
有什么办法可以得到吗?
我希望理解我的问题不会太复杂。这是我在工作中遇到的一个现实问题。
数据结构和我的代码
Table A
包含有关公司的一般信息:
company_id | branch_id | no_of_employees | city
Table B
包含公司的财务信息:
company_id | branch_id | revenue | profits
第一个SELECT:
SELECT branch_id FROM A WHERE CITY IN ('Dallas', 'Miami', 'New Orleans')
现在,运行在第一个 SELECT
中分别设置每个城市,我得到 branch_id
s:
branch_id | city
23 | Dallas
45 | Miami
45 | New Orleans
再次强调,两个城市如何拥有相同的分支 ID 似乎不切实际,但请耐心等待。
第二个SELECT:
SELECT branch_id FROM B
WHERE REVENUE = 5000000
我知道这有点不切实际,但对于这个例子来说,它就足够了。
运行这个查询我得到如下集合:
11
23
45
22
10
所以 INTERSECT
只会给我 23
和 45
。但是我想要45
两次,因为迈阿密和新奥尔良都有那个branch_id
而且那个branch_id
已经产生了500万的收入。
直接来自 Microsoft 的文档 (https://msdn.microsoft.com/en-us/library/ms188055.aspx)
:
"INTERSECT returns distinct rows that are output by both the left and right input queries operator."
所以不,使用 INTERSECT
时不可能两次获得相同的值,因为结果将是 DISTINCT
。但是,如果您正确构建 INNER JOIN
,您可以做与 INTERSECT
基本相同的事情,除了通过不使用 distinct
或 group by
.
来保持重复结果
SELECT
A.a
FROM
A
INNER JOIN B
ON A.a = B.d
AND B.F = '....'
WHERE b IN ('....')
对于您编辑的特定示例:
SELECT
branch_id
FROM
A
INNER JOIN B
ON A.branch_id = B.branch_id
AND B.REVENUE = 5000000
WHERE A.CITY IN ('Dallas', 'Miami', 'New Orleans')
你把你的任务复杂化了很多:
SELECT *
FROM A
WHERE CITY IN (...)
AND EXISTS
(
SELECT 1 FROM B
WHERE B.REVENUE = 5000000
AND B.branch_id = A.branch_id
)
INTERSECT
和 EXCEPT
都是返回应用了 DISTINCT
的行集。
INTERSECT
或 EXCEPT
不执行常规 joining/filtering 操作。
我知道这个问题的措辞很别扭,但我找不到更好的措辞了。让我解释一下情况。
table A
有一堆列(a
、b
、c
...)和我 运行 一个 SELECT
查询,像这样:
SELECT a FROM A WHERE b IN ('....')
(省略号表示要匹配的值数)
还有一个 table B
有一堆列 (d
, e
, f
... ) 我 运行 一个 SELECT
查询,像这样:
SELECT d FROM B WHERE f = '...'
(省略号表示要匹配的单个值)
现在我应该在这里说,两个 table 存储关于同一实体的不同类型的信息,但是列 a
和 d
包含完全相同的数据(在在这种情况下,一个 ID)。我想找出两个 table 的交集,所以我 运行 这个:
SELECT a FROM A WHERE b IN ('....') INTERSECT SELECT d FROM B WHERE f = '...'
问题来了:
第一个 SELECT
包含 WHERE
子句中的一组值,对吗?所以假设集合是 (1234
, 2345
,3456
)。现在,当 b
仅与 1234
匹配时,此查询的结果是 abc
。假设它与 2345
匹配时,它是 def
。与 3456
匹配,得到 abc
。
假设这两个结果(abc
和 def
)也在第二个 SELECT
.
所以,现在,将要匹配的整组值放回到 WHERE
子句中,INTERSECT
操作将得到 abc
和 def
。但是我想要 abc
两次,因为 WHERE
子句中的两个值与第二个 SELECT
.
有什么办法可以得到吗?
我希望理解我的问题不会太复杂。这是我在工作中遇到的一个现实问题。
数据结构和我的代码
Table A
包含有关公司的一般信息:
company_id | branch_id | no_of_employees | city
Table B
包含公司的财务信息:
company_id | branch_id | revenue | profits
第一个SELECT:
SELECT branch_id FROM A WHERE CITY IN ('Dallas', 'Miami', 'New Orleans')
现在,运行在第一个 SELECT
中分别设置每个城市,我得到 branch_id
s:
branch_id | city
23 | Dallas
45 | Miami
45 | New Orleans
再次强调,两个城市如何拥有相同的分支 ID 似乎不切实际,但请耐心等待。
第二个SELECT:
SELECT branch_id FROM B
WHERE REVENUE = 5000000
我知道这有点不切实际,但对于这个例子来说,它就足够了。
运行这个查询我得到如下集合:
11
23
45
22
10
所以 INTERSECT
只会给我 23
和 45
。但是我想要45
两次,因为迈阿密和新奥尔良都有那个branch_id
而且那个branch_id
已经产生了500万的收入。
直接来自 Microsoft 的文档 (https://msdn.microsoft.com/en-us/library/ms188055.aspx) : "INTERSECT returns distinct rows that are output by both the left and right input queries operator."
所以不,使用 INTERSECT
时不可能两次获得相同的值,因为结果将是 DISTINCT
。但是,如果您正确构建 INNER JOIN
,您可以做与 INTERSECT
基本相同的事情,除了通过不使用 distinct
或 group by
.
SELECT
A.a
FROM
A
INNER JOIN B
ON A.a = B.d
AND B.F = '....'
WHERE b IN ('....')
对于您编辑的特定示例:
SELECT
branch_id
FROM
A
INNER JOIN B
ON A.branch_id = B.branch_id
AND B.REVENUE = 5000000
WHERE A.CITY IN ('Dallas', 'Miami', 'New Orleans')
你把你的任务复杂化了很多:
SELECT *
FROM A
WHERE CITY IN (...)
AND EXISTS
(
SELECT 1 FROM B
WHERE B.REVENUE = 5000000
AND B.branch_id = A.branch_id
)
INTERSECT
和 EXCEPT
都是返回应用了 DISTINCT
的行集。
INTERSECT
或 EXCEPT
不执行常规 joining/filtering 操作。