2013-09-30 3 views
0

Я хочу использовать полное внешнее соединение для объединения двух таблиц с записями (id, value). Обе таблицы не имеют пересечений в поле id, но я хочу присоединиться к ним по полю id. Я пытаюсь использовать полное внешнее соединение для выполнения этого соединения, но я не понимаю, как это сделать.Нужна помощь в понимании полного внешнего соединения

Я использую DB2.

До сих пор у меня есть (каждый оператор выполняется вручную по отдельности):

create table S1 (
    id integer primary key not null, 
    value integer not null) 

create table S2 (
    id integer primary key not null, 
    value integer not null) 

insert into S1 values (0, 50) 
insert into S1 values (1, 20) 

insert into S2 values (2, 40) 
insert into S2 values (3, 90) 

select * from S1 full outer join S2 

Я получаю сообщение об ошибке на полное внешнее соединение попытка:

SQL0104N An unexpected token "join S2" was found following "* from S1 full 
outer". Expected tokens may include: "<space>". SQLSTATE=42601 

EDIT: Спасибо! У меня это работает, но я этого не ожидал.

select * from S1 full outer join S2 on S1.id = S2.id 

вопрос в том, что теперь он показывает (: означает пространство)

+--+-----+--+-----+ 
|ID|VALUE|ID|VALUE| 
+--+-----+--+-----+ 
|-:|-::::|3:|90:::| 
+--+-----+--+-----+ 
|-:|-::::|2:|40:::| 
+--+-----+--+-----+ 
|1:|20:::|-:|-::::| 
+--+-----+--+-----+ 
|0:|50:::|-:|-::::| 
+--+-----+--+-----+ 

Я не хотел дубликата поля. Есть ли способ сделать таблицу объединенной в a:

+--+-----+ 
|ID|VALUE| 
+--+-----+ 

стол?

Я попытался с помощью

select id from s1 
full outer join s2 on s1.id = s2.id 

и, разумеется, я получаю

SQL0203N A reference to column "ID" is ambiguous. SQLSTATE=42702 

РЕШИТЬ!

select coalesce(s1.id, s2.id) as id, \ 
     coalesce (s1.value, s2.value) as value \ 
from s1 full outer join s2 on s1.id = s2.id and s1.value = s2.value 
group by id asc 

и другое решение от D Stanley (mofidied)

SELECT Id, Value \ 
FROM S1 \ 
UNION ALL \ 
SELECT Id, Value \ 
FROM S2 \ 
ORDER BY ID ASC 

Спасибо!

+1

Вам все еще нужно сказать, что вы присоединяетесь на. Например. 'ON s1.id = s2.id'. Это только перекрестное соединение, которое не требует включения. – GarethD

+0

еще нужно предложение on ... добавление «on 1 = 1» в конец вашего запроса функционально создает кросс-соединение для этого – Twelfth

+0

Спасибо! Это работает, хотя теперь у меня проблема форматирования ... Любая помощь приветствуется! – Dmitry

ответ

3

Новый ответ

на основе обновленной вопрос, вы хотите UNION, а не JOIN:

SELECT Id, Value 
FROM S1 
UNION ALL 
SELECT Id, Value 
FROM S2 

Оригинальный ответ

Вы все еще должны иметь некоторые критерии для присоединения к таблицам. Если идентификаторы будут никогда пересекаются, вы можете просто использовать

SELECT * 
FROM S1 
FULL OUTER JOIN S2 ON S1.id = S2.id 
+0

Это хорошо работает, спасибо! – Dmitry

0

FULL OUTER JOIN, как другие Внешние и Внутренние РЕГИСТРИРУЙТЕСЬ хочет ВКЛ пункт после заявления таблиц.

Таким образом:

SELECT * 
FROM S1 
FULL OUTER JOIN S2 
ON S1.field = S2.field 

Только РЕГИСТРИРУЙТЕСЬ без оговорки является кросс JOIN (потому что реализует декартово произведение)

+0

Извините за отредактированное изображение. Я пытался изменить свой ответ и ошибался. –

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