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 ) )