2012-06-28 43 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的有效语法的文档?这看起来应该是正确的,但我想把它与文档进行验证。 –

相关问题