2017-03-08 33 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'旋出。 –