查找与SQL中的键值对匹配的案例

时间:2018-06-25 06:09:41

标签: sql sql-server

我遇到了一个问题,我找不到真正的词来解释它,假设我有一些外键具有一些键值对:

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不是答案。

实际上,在这种情况下,我需要更复杂的查询,因为我需要找到一个匹配两个以上键值对的案例。

2 个答案:

答案 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风格的保留关键字。使用其他东西。