1

这对我来说是满口的。我的挑战之一是我不知道如何提出问题——这从标题中显而易见。

我将尝试说明我的问题:

我有一张桌子,A:

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和与表 A 相关联AID。我想构建一个具有以下过滤器的查询: Position = 1 AND Value = 4并且Position = 3 AND Value = 5它为我提供了一个不同 ID 的列表,A.ID从中 stasify所有给定的标准。

我的意思是,如果我通过 INNER JOIN 将两个表连接在一起,我只希望拥有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)

这显然行不通。我以为我有一个明确的解决方案,但当我想到它时,我真的没有。

我对这个问题有点难过,我很难寻找如何解决它的策略,因为我什至不知道在我的搜索中使用什么关键字。

4

3 回答 3

1

你可以用GROUP BYand做到这一点HAVING

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

演示:SQL 小提琴

实际上可以将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
于 2015-02-02T00:59:09.440 回答
0

You missed to add parenthesis.

This is how your is executed.

(A.LocationID = 185
       AND  ( B.Position = 1
               AND B.Value = 4 ) )
              OR ( B.Position = 3
                   AND B.Value = 5 )  

AND has higher precedence than OR. Try this

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 ) ) 
于 2015-02-02T01:44:20.910 回答
0
SELECT DISTINCT A.ID
FROM A
WHERE A.ID IN(
    SELECT ID 
FROM B
WHERE    (B.Position = 1 AND B.Value = 4) OR
    (B.Position = 3 AND B.Value = 5)

)

如果我理解正确的话。

从 A.LocationID = 185 AND (B.Position = 1 AND B.Value = 4) OR (B.Position = 3 AND B.值 = 5)

于 2015-02-02T01:11:32.573 回答