我有一个表格格式如下:
row_key extID tag val
------- ----- --- ---
1 1 A a
2 1 A b
3 1 B c
4 2 A d
5 2 C e
现在我想拥有所有extID,其中有几对(tag,val)具有特定值,例如:
(tag, val) = (A,a) AND (tag, val) = (B,c)
或,
(tag, val) = (C,e)
约束的数量可以改变。
我可以想到几种方法:
WHERE extID IN (SELECT extID FROM ...)
哪一个是首选(最快和最优雅)的方式? (当然,除了“当然,5.是正确答案。”)
我认为多个SELF-join非常优雅。但是,我不知道它是否快速且相对记忆效率高。
此外,我想使用一种适用于MySQL,PostgreSQL和SQLite而无需适应的方式 - 这就是为什么我不能使用PIVOT afaiu。
答案 0 :(得分:2)
SELECT extID
FROM tableName
WHERE (tag = 'A' AND val = 'a') OR
(tag = 'B' AND val = 'c')
GROUP BY extID
HAVING COUNT(*) = 2
更新1
由于您没有提到可能存在tag
和val
的重复组合,因此需要DISTINCT
个关键字。
SELECT extID
FROM tableName
WHERE (tag = 'A' AND val = 'a') OR
(tag = 'B' AND val = 'c')
GROUP BY extID
HAVING COUNT(DISTINCT tag, val) = 2
答案 1 :(得分:0)
元组语法可行:
SELECT extID
FROM tableName
WHERE (tag, val) in (('A', 'a'), ('B', 'c'))
GROUP BY extID
HAVING COUNT(DISTINCT tag, val) = 2
HAVING COUNT(DISTINCT tag, val) = 2
确保每个约束元组至少存在一次。这意味着需要将2
调整为查询中约束元组的数量。
如果您有两个相同的行并且条件为('C', 'e')
:
row_key extID tag val
------- ----- --- ---
5 2 C e
6 2 C e
对此的查询如下所示:
SELECT extID
FROM tableName
WHERE (tag, val) in (('C', 'e'))
GROUP BY extID
HAVING COUNT(DISTINCT tag, val) = 1