我可以在两个表之间的INTERSECT操作中获得重复结果(来自一个表)吗?

时间:2016-07-09 17:50:13

标签: sql sql-server database tsql intersect

我知道问题的措辞很尴尬,但我无法更好地说出来。让我解释一下情况。

表格A有一堆列(abc ...)并且我运行{{1}像这样查询:

SELECT省略号表示要与匹配的多个值)

另一个表格SELECT a FROM A WHERE b IN ('....')有一堆列(Bde ...),我运行{{1}像这样查询:

f省略号表示要与匹配的单个值)

现在我应该说这两个表存储有关同一实体的不同类型的信息,但列SELECTSELECT d FROM B WHERE f = '...'包含完全相同的数据(在本例中为ID)。我想找出两个表的交集,所以我运行它:

a

现在问题在于:

第一个d包含SELECT a FROM A WHERE b IN ('....') INTERSECT SELECT d FROM B WHERE f = '...'子句中的一组值,对吧?因此,我们假设该集合为(SELECTWHERE1234)。现在,当2345仅与3456匹配时,此查询的结果就是b。当它与1234匹配时,它是abc,假设。与2345匹配,它会def

我们假设这两个结果(3456abc)也在第二个abc的结果集中。

所以,现在,将整个值集合回到def子句中,SELECT操作会给我WHEREINTERSECT。但我希望abc两次,因为def子句集中的两个值与第二个abc匹配。

我有什么方法可以得到它吗?

我希望理解我的问题并不复杂。这是我在工作中面临的现实问题。

数据结构和我的代码

WHERE包含有关公司的一般信息:

SELECT

A包含公司的财务状况:

company_id | branch_id | no_of_employees | city

首先选择

B

现在,在第一个company_id | branch_id | revenue | profits 分别运行每个城市,我得到了SELECT branch_id FROM A WHERE CITY IN ('Dallas', 'Miami', 'New Orleans')

SELECT

再一次,这对于两个城市如何拥有相同的分支ID似乎是不切实际的,但请耐心等待。

第二次选择

branch_id

我知道这有点不切实际,但就本例而言,它就足够了。

运行此查询我得到以下设置:

 branch_id | city   
        23 | Dallas 
        45 | Miami
        45 | New Orleans

因此SELECT branch_id FROM B WHERE REVENUE = 5000000 只会给我11 23 45 22 10 INTERSECT。但我希望23两次,因为迈阿密和新奥尔良都有4545已经产生了500万的收入。

2 个答案:

答案 0 :(得分:3)

直接来自Microsoft的文档(https://msdn.microsoft.com/en-us/library/ms188055.aspx) : “INTERSECT返回左右输入查询运算符输出的不同行。”

所以不,使用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')

答案 1 :(得分:2)

你的任务过于复杂:

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不会执行定期加入/过滤操作。