2010-08-10 1 views
1

У меня есть два стола, как это.SQL-запрос справки с OUTER JOIN?

Table1

Column |  Type  | 
---------+------------------+ 
cod  | text    | 
value99 | double precision | 

Table2

Column |  Type  | 
---------+------------------+ 
cod  | text    | 
value06 | double precision | 

и я хотел бы присоединиться к ним, так что я бы что-то вроде

Column |  Type  | 
---------+------------------+ 
cod  | text    | 
value99 | double precision | 
value06 | double precision | 

Проблема заключается в том, что не все коды присутствуют в обеих таблицах, поэтому, если код отсутствует в одной из таблиц, это значение должно быть нулевым. В конце концов, ка что-то вроде этого

cod  |  value99  |  value06  | 
---------+------------------+------------------+ 
1  |  10   |  20   | 
2  |  13   |  NULL  | 
3  |  NULL   |  15  | 

Я думаю, что его не представляется возможным с помощью ВЛЕВО или RIGHT JOIN .. или может быть, это ... какие-нибудь идеи? Thx =)

Редакцией: Я попытался FULL OUTER JOIN, но результат-то вроде

code value code value 
1  10  1 4 
2 15  NULL NULL 
NULL NULL 3 36 

ОТВЕТА !!!: я нашел ответ на ТНХ @Tobiasopdenbrouw:

SELECT test1.code,test1.value,test2.value FROM public.test1 LEFT OUTER JOIN public.test2 ON test1.code=test2.code 
UNION 
SELECT test2.code,test1.value,test2.value FROM public.test1 RIGHT OUTER JOIN public.test2 ON test1.code=test2.code 

ответ

2

Я предполагаю, немного, потому что ваш вопрос не описать требуемую мощность в деталях, но то, что вы, вероятно, нужно это вспомогательный запрос, который будет создать таблицу со всеми кодами для вас (а UNION из 2 SELECT запросов). Эта вспомогательная таблица может быть LEFT JOINED для ваших 2 исходных таблиц).

Редактировать: Я думал о (ПОЛНОМ) ВНЕШНЕМ СОЕДИНЕНИИ, отвечу сам, но, читая между строк, я не думаю, что это действительно нужно OP. Но я могу ошибаться, конечно.

+0

Я бы предпочел не использовать таблицу со всеми кодами. Но кажется, что полное внешнее соединение является ответом, но вывод дает мне «код» в двух столбцах – pleasedontbelong

+0

вы заглянули в ответ Кристофа? – Tobiasopdenbrouw

1

Используйте FULL OUTER JOIN.

Использование Полное внешнее объединение

Чтобы сохранить nonmatching информацию путем включения nonmatching строки в результатах Join, используйте полное внешнее соединение. SQL Сервер предоставляет полное внешнее соединение оператор, FULL OUTER JOIN, который включает в себя все строки из обеих таблиц, независимо от того, имеет ли таблица или нет.

Рассмотрите соединение в таблице продуктов и таблице SalesOrderDetail на их столбцах ProductID. Результаты показать только Продукты, которые имеют продажи заказы на них. Оператор JOIN ISO FULL OUTER указывает, что все строки из обеих таблиц должны быть включены в результаты , независимо от того, имеются ли в таблицах соответствующие данные в таблице .

Вы можете включить ИНЕКЕ с полного внешнего соединения, чтобы возвращать только строки, где нет соответствующих данных между таблицами. Следующий запрос возвращает только те продукты, которые не имеют заказов продаж соответствия, а также , как те заказы на продажу, которые не соответствует произведению (хотя все заказов на продажу, в данном случае, являются соответствие с продуктом).

1
select 
    coalesce(t1.cod, t2.cod) 
    ,t1.value99 
    ,t2.value06 
from 
    table1 t1 
    full outer join table2 t2 on t1.cod= t2.cod