2013-03-20 12 views
1

如果存在表A和表B.它們的結構是如下:合併若干列從兩個表中爲一個行對ID在前表中的每個

答:

id 

1 
2 

乙:

col_1 col_2 

m   q 
n   w 

如何通過SQL獲取C以下結果?

id  col_1 col_2 col_1 col_2 

1  m  q  n  w 
2  m  q  n  w 

對於表B中的每個數據時,它們與在表A的ID相關的表C中的變化級聯兩個表分成表C.一旦ID(屬於ID。在後表A),表C中的對應行改變。因此,爲了得到最終的表C,應該進行一些計算以獲得表C中的每個數據(col_1,col_2,col_1 col_2)

+0

關鍵名稱總是「m」和「n」?是否總是有兩個值導致四個額外的列? – 2013-03-20 15:00:49

+0

[你試過什麼](http://www.whathaveyoutried.com)? – Kermit 2013-03-20 15:13:05

+0

不,可能有多個鍵,從0到分數。如果表A與表B相結合,我們可以使用row_a行和2 * row_b列來獲取表C。我們需要注意的是,值3和4只是指示數字,它們會根據A中的ID而改變。謝謝 – 2013-03-21 02:06:06

回答

0

只要您事先知道B中可以出現多少個不同的值(有沒有太多),這應該工作:

select A.id, Once.key k1, Once.value v1, Twice.key k2, Twice.value v2 
from A,(select * from B where B.key='m') Once, 
(select * from B where B.key='n') Twice; 

編輯:這是上面的查詢得到的結果:

| ID | K1 | V1 | K2 | V2 | 
-------------------------- 
| 1 | m | 3 | n | 4 | 
| 2 | m | 3 | n | 4 | 
+0

感謝您的出色答案!我發現我已經說明了這個問題是錯誤的。表B應該是下面的格式:列鍵和列是與表A中的ID相關的所有數據,這意味着如果表A中的數字發生變化,鍵B和值將在表B中改變。想要得到的是對於表C中的每個id,表B中的相應行將被連接成表C中的一列。你有什麼想法來解決它嗎?謝謝 – 2013-03-21 02:16:22

+0

請參閱我的最新評論。謝謝。 – 2013-03-21 02:23:53

+0

@storage_pooling你能提供一個更明確的例子嗎?我看不出你想要做什麼,對不起。 – neutrino 2013-03-21 08:28:06

1

據我瞭解,你想獲得的所有來自表B的行以及與表A的ID相關聯的列。

我認爲這是不可能的只是一個查詢(不知道如果一個過程可以解決它),但我有一種方法可以幫助(我在MySQL上測試它)。

SELECT 
    `a`.`id`, 
    GROUP_CONCAT(`b`.`key`) AS `keys`, 
    GROUP_CONCAT(`b`.`value`) AS `values` 
FROM `a`, `b` 
GROUP BY `a`.`id` ASC; 

作爲結果,我們有:

 
---- ------ -------- 
| id | keys | values | 
---- ------ -------- 
| 1 | m,n | 3,4 | 
| 2 | m,n | 3,4 | 
---- ------ -------- 

在列密鑰和列的值的第一值的第一密鑰是指表B中的第一行。第二行指第二行等。這樣你只需要在分隔符''上分割一些服務器端代碼。

我搜索了從Postgres到MySQL GROUP_CONCAT的匹配命令,發現STRING_AGG可能做同樣的工作。

希望它有幫助!

+0

感謝您的出色答案!我發現我已經說明了這個問題是錯誤的。表B應該是下面的格式:列鍵和列是與表A中的ID相關的所有數據,這意味着如果表A中的數字發生變化,鍵B和值將在表B中改變。想要得到的是對於表C中的每個id,表B中的相應行將被連接成表C中的一列。你有什麼想法來解決它嗎?謝謝 – 2013-03-21 02:13:16