Мне нужно выполнить 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, потому что каждый человек присоединяется к каждому, что я ожидал. Любая помощь приветствуется, как всегда.
Используйте псевдонимы таблицы из таблицы, к которой вы присоединяетесь, во втором выборе своего союза, иначе вы получите NULL country_iso2 и суперсектор. Используйте UNION вместо UNION ALL, если вы не хотите видеть строки с указанными и полученными дважды. Кроме того, в запросе нет ничего плохого. – piotrm