如何查询具有复杂约束的“转置”表

时间:2017-03-08 03:15:58

标签: sql

我有下表

table1
id     name      value
-----------------------
 1       n1        v11
 1       n2        v12
 1       ...       ...
 1       nm        v1m
 2       n1        v21
 2       n2        v22
 2       ...       ...
 2       nm        v2m
 ...
 ...
 k       n1        vk1
 k       n2        vk2
 k       ...       ...
 k       nm        vkm

在此表中,每个id必须具有相同的名称集,尽管我们不知道他们在阅读表时是什么。

我希望通过以下约束来获取所有ID

1)如果name = ni,则value = 42 2)如果name = nj,则value = 24

如果上面的表格如下所示,那么我们可以

 select id from table2 where ni = 42 and nj = 24

 table2
 id    n1    n2   ...   nm
 ---------------------------
  1    v11   v12  ...   v1m
  2    v21   v22  ...   v2m
  ...
  k    vk1   vk2  ...   vkm

但是在原始表1中,我不确定这样做的最佳方法是什么。 也许对于这种约束,可以有一个特殊的查询。但是,如果约束更复杂,就像     n1!= 19或不(n2 = 55且n3 = 44) 我找不到一般的解决方案。

我可以将table1定义为table2。但是要为table2添加一个新名称,我们必须通过添加一个新列来更改table2的设计......有没有更好的解决方案?谢谢。

1 个答案:

答案 0 :(得分:2)

您甚至不需要table2,因为它可以使用数据透视查询从table1生成:

SELECT id,
       MAX(CASE WHEN name = 'n1' THEN value END) AS n1,
       MAX(CASE WHEN name = 'n2' THEN value END) AS n2,
       ...
       MAX(CASE WHEN name = 'nm' THEN value END) AS nm
FROM table1
GROUP BY id