使用我的心理调试能力:
如果出现以下情况,您希望值为 1:
- 有一行 Key="A" 和 value="V1" AND
- 还有另一行 Key="B" 和 value="V2"
要获得像第一个这样的行,您需要:
select 1 from myTable where key = 'A' and value = 'V1'
要获得像第二个一样的行,您需要
select 1 from myTable where key = 'B' and value = 'V2'
现在您需要确保这两行都存在。
这听起来并不简单,因为 SQL 检查where
单行上的所有条件,所以语句如下:
select 1 from myTable where key = 'A' and key = 'B'
是荒谬的,因为它要求键列同时具有两个不同的值。
一种(低效)解决方案是将表连接到自身
select 1
from mytable t1
cross join mytable t2
where t1.Key = 'A' and t1.Value='V1'
and t2.Key = 'B' and t2.Value='V2'
这将生成表格的笛卡尔积,将每一行与其他行连接起来。它会产生
t1.Key|t1.Value|t2.Key|t2.Value
-------------------------------
A | V1 | A | V1
B | V2 | A | V1
C | V3 | A | V1
A | V1 | B | V2 <-- the row you need
B | V2 | B | V2
C | V3 | B | V2
A | V1 | C | V3
B | V2 | C | V3
C | V3 | C | V3
并使您能够同时检查原始表的两行。
请注意,这将生成一个 count^2 行的表,因此如果表的行数超过几行,或者您需要同时检查两行以上,请不要使用它。