我知道问题的措辞很尴尬,但我无法更好地说出来。让我解释一下情况。
表格A
有一堆列(a
,b
,c
...)并且我运行{{1}像这样查询:
SELECT
(省略号表示要与匹配的多个值)
另一个表格SELECT a FROM A WHERE b IN ('....')
有一堆列(B
,d
,e
...),我运行{{1}像这样查询:
f
(省略号表示要与匹配的单个值)
现在我应该说这两个表存储有关同一实体的不同类型的信息,但列SELECT
和SELECT d FROM B WHERE f = '...'
包含完全相同的数据(在本例中为ID)。我想找出两个表的交集,所以我运行它:
a
现在问题在于:
第一个d
包含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
表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
两次,因为迈阿密和新奥尔良都有45
而45
已经产生了500万的收入。
答案 0 :(得分:3)
直接来自Microsoft的文档(https://msdn.microsoft.com/en-us/library/ms188055.aspx) : “INTERSECT返回左右输入查询运算符输出的不同行。”
所以不,使用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')
答案 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
)
INTERSECT
和EXCEPT
都返回了应用了DISTINCT
的行集。
INTERSECT
或EXCEPT
不会执行定期加入/过滤操作。