T-SQL-仅当连接的行满足一系列标准时,才在表中查找不同的值
这对我来说太多了。 我面临的一个挑战是,我不知道如何表述这个问题——从标题上看,这是显而易见的 我将尝试说明我的问题: 我有一张桌子,一张:T-SQL-仅当连接的行满足一系列标准时,才在表中查找不同的值,sql,sql-server,join,set-theory,Sql,Sql Server,Join,Set Theory,这对我来说太多了。 我面临的一个挑战是,我不知道如何表述这个问题——从标题上看,这是显而易见的 我将尝试说明我的问题: 我有一张桌子,一张: ID LocationID 11 185 12 185 13 206 表B: ID AID Position Value 1 11 1 4 2 11 3 8 3 11 5 4 4 12 1
ID LocationID
11 185
12 185
13 206
表B:
ID AID Position Value
1 11 1 4
2 11 3 8
3 11 5 4
4 12 1 4
5 12 2 4
6 12 3 5
表B通过ID
和AID
与表A相关联。我想构造一个具有以下筛选器的查询:
Position=1和Value=4
和Position=3和Value=5
,它为我提供了一个与a.ID
不同的ID列表,该列表保存了所有给定标准
我的意思是,如果我用一个内部联接将两个表联接在一起,我只希望A.ID=12
我自己开始解决这个问题的思路是:
SELECT DISTINCT A.ID
FROM A
INNER JOIN B ON (A.ID = B.AID)
WHERE
A.LocationID = 185 AND
(B.Position = 1 AND B.Value = 4) OR
(B.Position = 3 AND B.Value = 5)
这显然不起作用。我以为我有一个明确的解决办法,但当我想到它,我真的没有
我有点被这个问题难住了,我很难找到解决这个问题的策略,因为我甚至不知道在搜索中使用什么关键字。你可以通过
分组方式和拥有:
SELECT A.ID
FROM A
INNER JOIN B ON (A.ID = B.AID)
GROUP BY A.ID
HAVING MAX(CASE WHEN A.LocationID = 185 THEN 1 END) = 1
AND MAX(CASE WHEN B.Position = 1 AND B.Value = 4 THEN 1 END) = 1
AND MAX(CASE WHEN B.Position = 3 AND B.Value = 5 THEN 1 END) = 1
演示:
实际上,可以将LocationID
标准移动到WHERE
:
SELECT A.ID
FROM Table1 A
INNER JOIN Table2 B ON (A.ID = B.AID)
WHERE A.LocationID = 185
GROUP BY A.ID
HAVING MAX(CASE WHEN B.Position = 1 AND B.Value = 4 THEN 1 END) = 1
AND MAX(CASE WHEN B.Position = 3 AND B.Value = 5 THEN 1 END) = 1
如果我理解正确的话
选择不同的A.ID
从
内部连接B打开(A.ID=B.AID)
哪里
A.LocationID=185和
(B.位置=1,B.值=4)或
(B.Position=3和B.Value=5)您没有添加括号
这就是执行您的命令的方式
(A.LocationID = 185
AND ( B.Position = 1
AND B.Value = 4 ) )
OR ( B.Position = 3
AND B.Value = 5 )
和
的优先级高于或
。试试这个
SELECT DISTINCT A.ID
FROM A
INNER JOIN B
ON ( A.ID = B.AID )
WHERE A.LocationID = 185
AND ( ( B.Position = 1
AND B.Value = 4 )
OR ( B.Position = 3
AND B.Value = 5 ) )
SELECT DISTINCT A.ID
FROM A
INNER JOIN B
ON ( A.ID = B.AID )
WHERE A.LocationID = 185
AND ( ( B.Position = 1
AND B.Value = 4 )
OR ( B.Position = 3
AND B.Value = 5 ) )