2013-12-17 3 views
0

Это мой вопрос:Объединение запросов с разными столбцами в одной записи

У меня есть несколько запросов, где каждый запрос возвращает мне 2 столбца.

Пример:

1.- Клиент - Дахи

2.- Клиент - Patr

3.- Клиент - Orts

. . . .

45.-клиент - Tire

Всегда получить клиент с другим столбцом.

Результат для запроса, если я делаю союз, как это: (Конечно, многие строки с он же клиента, но разного значения столбца)

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 и группу по идентификатору клиента, чтобы получить 1 строку на каждого клиента. Если это не сработает, то после достижения результирующего набора вы можете агрегировать с помощью max и group by client. – 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 вводят по одной таблице за раз.

Смежные вопросы