Sql 统一同一记录中具有不同列的查询
这是我的问题: 我有几个查询,每个查询检索两列 例如: 1.客户-大喜 2.客户-Patr 3.客户-运动 。 . . -客户-轮胎 始终使用不同的列检索客户端 如果我创建一个并集,查询的结果如下:(当然,许多行具有相同的客户机,但列的值不同) 我希望像这样统一查询和检索(每个客户机一列,统一一条记录中的不同列):Sql 统一同一记录中具有不同列的查询,sql,performance,oracle,Sql,Performance,Oracle,这是我的问题: 我有几个查询,每个查询检索两列 例如: 1.客户-大喜 2.客户-Patr 3.客户-运动 。 . . -客户-轮胎 始终使用不同的列检索客户端 如果我创建一个并集,查询的结果如下:(当然,许多行具有相同的客户机,但列的值不同) 我希望像这样统一查询和检索(每个客户机一列,统一一条记录中的不同列): 一些想法?你想做一个完整的外部连接。以下是四个查询的示例: select coalesce(q1.client, q2.client, q3.client, q4.client)
一些想法?你想做一个完整的外部连接。以下是四个查询的示例:
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;
子查询获取所有客户机的列表(如果在单独的表中则更好)。后续的
左外部联接
s一次引入一个表。假设您正在使用pivot构建结果集,您可能只需要使用聚合函数max和group by The client id为每个客户端获取一行。如果这不起作用,那么在获得结果集之后,可以使用max和group by client进行聚合。
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);
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;