2014-11-05 3 views
1

Я создаю запрос, в котором я пытаюсь сделать эксклюзивное левое соединение, но я не мог найти решение без использования двух запросов, связанных с объединением всех.Эксклюзивное левое соединение на нескольких таблицах

My SQL, что не работает, как ожидалось:

select link_table.key as lk_key, table_a.key as a_key, table_b.key as b_key 
from link_table 
left join table_a on (link_table.key = table_a.key_link_table) 
left join table_b on (link_table.key = table_b.key_link_table) 

Что я получаю в результате:

lk_key  a_key b_key 
123  abc  xyz 
456  def  uvw 
789  ghi  NULL 

Мой обходной путь:

select link_table.key as lk_key, table_a.key as a_key, null as b_key from link_table 
left join table_a on (link_table.key = table_a.key_link_table) 
union all 
select link_table.key as lk_key, null as a_key, table_b.key as b_key from link_table 
left join table_b on (link_table.key = table_b.key_link_table) 

Что я получаю в результате и хотел бы получить первый SQL t О выполнения:

lk_key  a_key b_key 
123  abc  NULL 
123  NULL xyz 
456  def  NULL 
456  NULL uvw 
789  ghi  NULL 

Возможно ли это в одном запросе?

+1

Что случилось с вашим «обходным решением»? –

+1

Если это сработает, зачем его менять? Это займет 9 лет? Выводит ли он неправильные данные? В нем слишком много гласных? – Siyual

+0

Я подумал, что, возможно, было ключевое слово sql/oracle, которое соответствует моей конкретной потребности вместо использования union. И нет, пока у меня нет проблем с производительностью. Просто мне потребовалось некоторое время, пока я не выяснил проблему. – Flexy

ответ

0

Переформатированный вопрос: Пожалуйста, используйте код, чтобы разместить этот материал здесь.

select 
link_table.key as lk_key, 
table_a.key as a_key, 
table_b.key as b_key 
    from link_table 
left join table_a on 
    (link_table.key = table_a.key_link_table) 
left join table_b on 
    (link_table.key = table_b.key_link_table) 

Что я получаю в результате:

lk_key a_key b_key 
123 abc xyz 
456 def uvw 
789 ghi NULL 

Wanted результат:

lk_key a_key b_key 
123 abc NULL 
123 NULL xyz 
456 def NULL 
456 NULL uvw 
789 ghi NULL 

Мой обходной

select * from link_table 
left join 
table_a on (link_table.key = table_a.key_link_table) 

union all 

select * 
from link_table 
left join table_b on 
    (link_table.key = table_b.key_link_table) 

Попробуйте это:

select 
link_table.key as lk_key, 
table_a.key as a_key, 
table_b.key as b_key 
    from link_table 
full outer join table_a on 
    (link_table.key = table_a.key_link_table) 
full outer join table_b on 
    (link_table.key = table_b.key_link_table) 
where a_key is NULL or 
b_key is NULL 

http://i.stack.imgur.com/qje6o.png

+0

Спасибо, я попробую с полным внешним объединением посмотреть, работает ли он, как только я снова получаю доступ к БД. – Flexy

0

union allявляется один запрос. Это один запрос, состоящий из двух частей.

Если присоединяется к двум таблицам не дают дубликаты во второй таблице, вы также можете сделать:

select link_table.key as lk_key, table_a.key as a_key, table_b.key as b_key 
from link_table left join 
    table_a 
    on link_table.key = table_a.key_link_table left join 
    table_b 
    on link_table.key = table_b.key_link_table; 

Это не совсем эквивалентно, так как он может производить дубликаты, если есть несколько матчей в любом table_a или table_b. Но в вашем случае это может сделать то, что вы хотите.

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