Sql 如何查询';转置';具有复杂约束的表

Sql 如何查询';转置';具有复杂约束的表,sql,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 ... .

我有下表

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) 如果名称=ni,则值=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) 我找不到一个普遍的解决办法


我可以将表1定义为表2。但是为了给表2添加一个新名称,我们必须通过添加一个新列来改变表2的设计。。。有没有更好的解决办法?谢谢。

您甚至不需要
表2
,因为它可以使用透视查询从
表1
生成:

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

Biegeisen:group by和max的有趣用法!“查询计划”还表明此查询也是有效的。谢谢。@JoeC如果您需要更改值,只需在
table1
中进行更改,然后使用我的查询将
table2
导出即可。