2013-04-20 2 views
1

Мне нужно выполнить FULL OUTER JOIN на двух таблицах, и я пытаюсь реализовать ее в MySQL, используя метод LEFT JOIN/RIGHT JOIN/UNION ALL.Только MySQL UNION Включает первую таблицу

Вот оригинальные столы:

giving_totals: 
+--------------+---------------+-------------+ 
| country_iso2 | total_given | supersector | 
+--------------+---------------+-------------+ 
| AE   | 1396986989.02 |   3 | 
| AE   | 596757809.20 |   4 | 
| AE   | 551810209.87 |   5 | 
| AE   | 25898255.77 |   7 | 
| AE   |  32817.63 |   9 | 
... 
+--------------+---------------+-------------+ 

receiving_totals: 
+--------------+----------------+-------------+ 
| country_iso2 | total_received | supersector | 
+--------------+----------------+-------------+ 
| AE   | 34759000.00 |   3 | 
| AE   |  148793.82 |   7 | 
| AE   |   734.30 |   9 | 
| AF   | 6594479965.85 |   1 | 
| AF   | 2559712971.26 |   2 | 
+--------------+----------------+-------------+ 

Я хочу, чтобы результирующая таблица имеет одну запись для каждой страны, для каждого кода supersector, даже если он не давал и не получить деньги для этого сектора (это из AidData, если кто-нибудь знаком.) Я решил сделать это, выполнив UNION of LEFT JOIN (чтобы получить все записи) и RIGHT JOIN (чтобы получить все принимающие записи.) Вот запрос, который я пробовал:

SELECT g.country_iso2 AS country_iso2, g.total_given AS `total_given`,R.total_received AS `total_received`,g.supersector AS `supersector` 
FROM (`giving_totals` `g` 
LEFT JOIN `receiving_totals` `r` 
ON(((g.country_iso2 = r.country_iso2) 
AND (g.supersector = r.supersector)))) 

UNION ALL 

SELECT g.country_iso2 AS country_iso2, g.total_given AS `total_given`,R.total_received AS `total_received`,g.supersector AS `supersector` 
FROM (`giving_totals` `g` 
RIGHT JOIN `receiving_totals` `r` 
ON(((g.country_iso2 = r.country_iso2) 
AND (g.supersector = r.supersector)))) 

Но это возвращает только первое jo в том, вставил ли я сначала или влево или влево. Я думаю, что я могу ошибаться в операции UNION, потому что каждый человек присоединяется к каждому, что я ожидал. Любая помощь приветствуется, как всегда.

+0

Используйте псевдонимы таблицы из таблицы, к которой вы присоединяетесь, во втором выборе своего союза, иначе вы получите NULL country_iso2 и суперсектор. Используйте UNION вместо UNION ALL, если вы не хотите видеть строки с указанными и полученными дважды. Кроме того, в запросе нет ничего плохого. – piotrm

ответ

0

Вот альтернативный способ сделать full outer join:.

SELECT driver.country_iso2 AS country_iso2, 
     g.total_given AS `total_given`, 
     R.total_received AS `total_received`, 
     driver.supersector AS `supersector` 
from ((select distinct country_iso2, supersector 
     from giving_totals 
    ) union 
     (select distinct country_iso2, supersector 
     from receiving_totals 
    ) 
    ) driver left outer join 
    giving_totals gt 
    on gt.country_iso2 = driver.country_iso2 and 
     gt.supersector = driver.country_iso2 left outer join 
    receiving_totals rt 
    on rt.country_iso2 = driver.country_iso2 and 
     rt.supersector = driver.country_iso2 

То есть, сделать объединение как подзапрос, чтобы получить все комбинации, которые заинтересованы в Тогда вы можете сделать left outer join к этой таблице.

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

SELECT r.country_iso2 AS country_iso2, g.total_given AS `total_given`,R.total_received AS `total_received`,r.supersector AS `supersector` 
FROM (`giving_totals` `g` 
RIGHT JOIN `receiving_totals` `r` 
ON(((g.country_iso2 = r.country_iso2) 
AND (g.supersector = r.supersector)))) 

Оригинальная форма будет иметь NULL для этих значений.

+0

Используя ваш первый запрос, поля total_given и total_received являются NULL (что я вижу сейчас, когда вы упомянули в нижней части сообщения.) Но как использовать второй запрос для получения фактических значений? Выполнение этого запроса само по себе имело тот же эффект, что и исходный запрос. – Matt

+0

@Matt. , , Вы получаете значения NULL, когда есть несоответствия. Некоторые значения изо/суперсектора существуют только в одной таблице. Значение в другой таблице будет NULL. –

+0

Я все еще пытаюсь это понять, но я не понимаю, почему СОЮЗ, который я пробовал, не работает. Вместе ЛЕВЫЙ ПРИСОЕДИНЕНИЕ И ПРАВОЕ СОЕДИНЕНИЕ имеют все возможные комбинации, поэтому их включение в одну таблицу должно иметь их все вместе. Но СОЮЗ не работал так, как следовало бы. Возможно, я не понимаю ваши комментарии, но я до сих пор не понимаю, почему мой первоначальный запрос не будет работать. – Matt

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