使用同一记录中的不同列统一查询

时间:2013-12-17 13:50:59

标签: sql performance oracle

这是我的问题:

我有几个查询,每个查询都会检索到2列。

示例:

1.-客户 - 达希

2.-客户 - Patr

3.-客户 - Orts

。 。 。

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

一些想法?

1 个答案:

答案 0 :(得分: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一次引入一个表格。