我可以在两个 table 之间的 INTERSECT 运算中得到重复的结果(来自一个 table)吗?

Can I get duplicate results (from one table) in an INTERSECT operation between two tables?

我知道这个问题的措辞很别扭,但我找不到更好的措辞了。让我解释一下情况。

table A 有一堆列(abc ...)和我 运行 一个 SELECT 查询,像这样:

SELECT a FROM A WHERE b IN ('....')省略号表示要匹配的值数

还有一个 table B 有一堆列 (d, e, f ... ) 我 运行 一个 SELECT 查询,像这样:

SELECT d FROM B WHERE f = '...'省略号表示要匹配的单个值

现在我应该在这里说,两个 table 存储关于同一实体的不同类型的信息,但是列 ad 包含完全相同的数据(在在这种情况下,一个 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

假设这两个结果(abcdef)也在第二个 SELECT.

的结果集中

所以,现在,将要匹配的整组值放回到 WHERE 子句中,INTERSECT 操作将得到 abcdef。但是我想要 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_ids:

 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 只会给我 2345。但是我想要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 基本相同的事情,除了通过不使用 distinctgroup 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
    )

INTERSECTEXCEPT 都是返回应用了 DISTINCT 的行集。 INTERSECTEXCEPT 不执行常规 joining/filtering 操作。