2017-03-08 36 views
1

我有以下表如何查询“换位”复杂约束表

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必须具有相同的名称集,虽然我们不知道它们是什么W/O读桌子。

我想获得所有的ID具有下面的约束

1)如果名字= NI,则值= 42 2)如果名字= NJ,然后值= 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 

但是在原始table1中,我不知道这样做的最佳方式是什么。 也许对于这个约束,可以有一个特殊查询。但是,如果约束更复杂,如 n1!= 19或不(n2 = 55和n3 = 44) 我找不到一个通用的解决方案。

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

回答

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 
+0

Biegeieisen:通过和最大有趣的用途组!另外'查询计划'显示这个查询也是有效的。谢谢。 –

+0

@JoeC如果您需要更改值,只需在'table1'中执行此操作,然后使用我的查询将'table2'旋出。 –