SQL首选关键字搜索方式

时间:2013-02-18 08:39:36

标签: sql select self-join

我有一个表格格式如下:

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)

约束的数量可以改变。

我可以想到几种方法:

  1. 为每个约束执行自联接
  2. 在调用者程序中进行搜索(迭代)(多个SQL查询)
  3. (也许?)编写一个SQL函数来执行此操作
  4. 嵌套的SELECT子句(将“extID”传递给外层并使用WHERE extID IN (SELECT extID FROM ...)
  5. 我唯一找不到的真正解决方案。
  6. 哪一个是首选(最快和最优雅)的方式? (当然,除了“当然,5.是正确答案。”)

    我认为多个SELF-join非常优雅。但是,我不知道它是否快速且相对记忆效率高。

    此外,我想使用一种适用于MySQL,PostgreSQL和SQLite而无需适应的方式 - 这就是为什么我不能使用PIVOT afaiu。

2 个答案:

答案 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

由于您没有提到可能存在tagval的重复组合,因此需要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