使用具有不同别名的相同数据库表来检索数据

时间:2013-10-29 14:05:24

标签: sql sql-server

这里我要做的是获取应该来自A3的P1,P2,P3的值, 这适用于两个表但不适用于三个......

SELECT x.A1,x.A3,x.A4,A5,A6, x.A2 as P1,y.A2 as P2,z.A2 as P3
FROM Contact x,Contact y,Contact z
WHERE (x.id = y.id) AND (y.id = z.id)   AND
(x.A3 ='pre-sale') AND (y.A3= pos-sale') AND(z.A3='current-sale') 
 ORDER by x.A4 DESC

例如      CONTACT表看起来像这样,有一些P1,P2,P3的预期结果

 A1   A2       A3         A4     A5   A6   P1  P2 P3 
 ----------------------------------------------------
 1    22     pre-sale     9     kk    8    22  31  2 
 2    31     pos-sale     4     yy    6    44  61  11
 3    2      current-sale 1     hh    2    null null null
 4    44     pre-sale     2     kk    8      
 5    61     pos-sale     1     yy    6      
 6    11     current-sale 1     hh    2    

对于P1,P2使用两次相同的表工作正常,添加第三个表的值      对于P1,P2是相同的,对于P3都是null

1 个答案:

答案 0 :(得分:0)

我怀疑你尝试做的事情最好用条件聚合完成。要告诉你真正想要完成的事情有点难,因为并非所有列都是别名。这是一个例子

SELECT c.id,
       max(case when c.A3 = 'pre-sale' then A4 end) as PreSale_A4,
       max(case when c.A3 = 'pos-sale' then A2 end) as PosSale_A2,
       max(case when c.A3 = 'current-sale' then A4 end) as CurrentSale_A2
FROM Contact c
group by c.id
order by PreSale_A4 desc;

您的原始查询存在一些基本问题。例如,您通过where子句使用隐式连接,它始终是内部连接。您的问题的解决方案可能是使用外部联接。但是,条件聚合可能解决了这个问题。