2013-12-17 65 views
0

这是我的问题:在同一记录中使用不同列的统一查询

我有几个查询,其中每个查询检索我2列。

实施例:

1.-客户端 - 代希

2.-客户端 - PATR

3.-客户端 - 沃茨

。 。 。 。

45.客户端 - 轮胎

总是以不同的列中检索客户端。

用于查询的结果,如果我做一个工会是这样的:(当然,与列的他同一个客户,但型动物值多行)

Client Dahi Patr Orts ......... Tyre 
    1   x 
    1       x 
    2     x       
    3   x 
    3     x   
    3           x 

我想统一查询和检索像这样(每个客户端一列,统一不同列中的一条记录):

Client Dahi Patr Orts ......... Tyre 
    1   x    x 
    2     x 
    3   x  x       x 

有些想法?

+0

假设您使用数据透视表构建结果集,您可能只能使用聚合函数max和group by client id来为每个客户端获得1行。如果这不起作用,那么在达到结果集后,您可以按客户端使用max和group进行聚合。 – xQbert

回答

1

你想做一个完整的外连接。下面是四个查询的例子:

select coalesce(q1.client, q2.client, q3.client, q4.client) as client, 
     q1.Dahi, q2.Patr, q3.Orts, q4.Tyre 
from q1 full outer join 
    q2 
    on q2.client = q1.client full outer join 
    q3 
    on q3.client = coalesce(q1.client, q2.client) full outer join 
    q4 
    on q4.client = coalesce(q1.client, q2.client, q3.client); 

一个与full outer join问题是client列可能是NULL对上表/子查询。这就是为什么连接条件需要coalesce()

如果您有客户端列表,可以简化该查询。 。 。或者如果您为所有子查询计算一个。下面是一个示例:

select coalesce(q1.client, q2.client, q3.client, q4.client) as client, 
     q1.Dahi, q2.Patr, q3.Orts, q4.Tyre 
from (select client from q1 union 
     select client from q2 union 
     select client from q3 union 
     select client from q4 
    ) driver left outer join 
    q1 
    on q1.client = driver.client left outer join 
    q2 
    on q2.client = driver.client left outer join 
    q3 
    on q3.client = driver.client left outer join 
    q4 
    on q4.client = driver.client; 

子查询获取所有客户端的列表(如果它位于单独的表中,则更好)。随后的left outer join s一次带一张表。

相关问题