我遇到了一个问题,我找不到真正的词来解释它,假设我有一些外键具有一些键值对:
10 => (2, 3) , (4, 5)
11 => (2, 1), (4, 5)
可以将其映射到下表中:
ID | FK | Key | Value
-----------------------------
1 | 10 | 2 | 3
2 | 10 | 4 | 5
3 | 11 | 2 | 1
4 | 11 | 4 | 5
我想查询所有配对为(2, 3) AND (4, 5)
的FK,答案为FK => 10
,这就是问题所在!
如果我使用AND
SELECT FK
FROM MyTable
WHERE (Key = 2 AND Value = 3)
AND
(Key = 4 AND Value = 5)
它什么也不会返回,如果我使用OR:
SELECT FK
FROM MyTable
WHERE (Key = 2 AND Value = 3)
OR
(Key = 4 AND Value = 5)
它返回10和11作为答案,而11不是答案。
实际上,在这种情况下,我需要更复杂的查询,因为我需要找到一个匹配两个以上键值对的案例。
答案 0 :(得分:2)
您可以尝试INTERSECT运算符:
Select FK from <<tableName>> where key = 2 and value = 3
INTERSECT
Select FK from <<tableName>> where key = 4 and value = 5
答案 1 :(得分:1)
您当前的逻辑是正确的,但是WHERE
子句中的所有内容都将应用于单个记录。另一方面,您希望对属于同一FK
的记录的组设置这些限制。如果要查找具有FK
和(2, 3)
作为键值对的所有(4, 5)
,并且每个键发生一次,而没有其他对发生,请对{{1}使用条件聚合}子句:
HAVING
注意:您可能应该避免调用列(或表等)SELECT FK
FROM yourTable
GROUP BY FK
HAVING
COUNT(*) = 2 AND -- only two key/value pairs
SUM(CASE WHEN [Key] = 2 AND Value = 3 THEN 1 ELSE 0 END) = 1 AND -- (2, 3)
SUM(CASE WHEN [Key] = 4 AND Value = 5 THEN 1 ELSE 0 END) = 1; -- (4, 5)
,因为这可能是SQL Server和大多数SQL风格的保留关键字。使用其他东西。