2012-06-28 77 views
2

我正在使用pyodbc和postgres。我可以給多個列別名嗎?怎麼樣?

我可以給多個列別名嗎?

這裏是我的問題的描述:

數據結構:

data 
id | c1 | c2 
------------- 
1 | 11 | 12 
2 | 21 | 22 

符號:C是列

dictionary 
id | key | value 
---------------- 
1 | k1 | v11 
1 | k2 | v12 
2 | k1 | v21 
2 | k2 | v22 

符號:K是關鍵,V是價值

您可以將k1和k2視爲兩列。數據結構就是這樣,因爲它不斷變化。我沒有設計它,我只需要去設計它。

我想不出一個SQL查詢(由一些名最重要的是,對於一些行,我可以訪問K1和K2列)給我像下面這樣:

data 
id | c1 | c2 | k1 | k2 
------------------------- 
1 | 11 | 12 | v11 | v12 
2 | 21 | 22 | v21 | v22 

這個問題我繼續運行是如果我別名表,然後SQL結果將包含字典表中的兩個「關鍵」列,這意味着我無法控制我訪問這兩個列,但如果我別名行,然後我可以不控制在sql語句中引用哪些表。

我想解決辦法是別名兩列:

SELECT * FROM data 
FULL JOIN dictionary AS a1,a2,a3 
ON data.id = a1 
FULL JOIN dictionary AS a4,a5,a6 
ON data.id = a4 
WHERE a2 = k1 and a5 = k2 

符號:一個是別名

這樣的結果在理論上看起來像

data 
id | c1 | c2 | a3 | a6 
------------------------- 
1 | 11 | 12 | v11 | v12 
2 | 21 | 22 | v21 | v22 

注意所有a在技術上會在這裏,但是3和6是我感興趣的那些

+0

您剛剛構造了新的語法,還是僅僅是一個我從未使用過的別名構造? – 2012-06-28 23:59:10

+0

我認爲這裏的關鍵詞是「彙總」;場景中結果集的*形狀*(即列)發生變化,對吧?一般來說SQL是不好的,在這種情況下,動態(或一次性)查詢就會得到'k0 ... kN'列... – 2012-06-29 00:14:35

+0

是的,我正在編寫語法來描述我想要的行爲(哪些列我需要訪問)。 Andomar的答案顯示了正確的語法。 –

回答

2

你可以將整個表格別名,例如dictionary as d1。然後參考該表中的列名稱d1.col1。例如:

SELECT d.id 
,  d.c1 
,  d.c2 
,  d1.value as a3 
,  d2.value as a6 
FROM data as d 
LEFT JOIN 
     dictionary as d1 
ON  data.id = d1.id 
     and d1.key = 'k1' 
LEFT JOIN 
     dictionary as d2 
ON  data.id = d2.id 
     and d2.key = 'k2' 
+0

這會導致我提到的兩個問題之一,不是嗎? (生成的表格將包含重複的列名稱。) –

+0

您可以在選擇,回答編輯後對列進行別名。有點驚訝,你可以寫一個'完全加入'而不是別名列,呵呵:) – Andomar

+0

哦,我明白了。謝謝!我希望這可以工作!我只是不知道如何做多個別名。是否有可能做一些像SELECT *,d1.value as a3,d2.value as a6 ...?因爲實際的數據有很多列...哪裏有關sql的有效語法的文檔?這看起來應該是正確的,但我想把它與文檔進行驗證。 –

相關問題