2016-06-29 2 views
1

Я хочу UNION таблиц с одинаковыми столбцами, например:MySQL UNION таблицы по одной уникальной области

table1 
id  var1 var2 
1  green red 
2  blue NULL 

table2 
id  var1 var2 
2  NULL pink 
3  red  blue 

Мой результат должен выглядеть так:

id  var1 var2 
1  green red 
2  blue pink 
3  red  blue 

А «нормальный» UNION создает следующий результат:

id  var1 var2 
1  green red 
2  blue NULL 
2  NULL pink 
3  red  blue 

... с двумя идентификаторами = 2 ввода, поскольку две строки с id = 2 не идентичны. Тем не менее, я хотел бы иметь только один единственный ряд с идентификатором 2.

Мой текущий обходной путь выглядит следующим образом:

Шаг 1

CREATE OR REPLACE VIEW temp AS 
SELECT id FROM table1 
UNION 
SELECT id FROM table2; 

Шаг 2

SELECT t1.id, IFNULL(t2.var1, t3.var1) AS var1, IFNULL(t2.var2, t3.var2) AS var2 
FROM temp AS t1 
LEFT JOIN table1 AS t2 ON t1.id = t2.id 
LEFT JOIN table2 AS t3 ON t1.id = t3.id; 

Я не могу поверить, что это самый умный способ решить проблему, так как это такое обычное о северо-восток И это настоящая боль в шее, когда число таблиц или переменных увеличивается.

Спасибо за любую умную идею!

ответ

1

Вот один из способов использования not exists:

select id, var1, var2 
from table1 
union all 
select id, var1, var2 
from table2 t2 
where not exists (
    select 1 
    from table1 t1 
    where t1.id = t2.id 
    ) 

Вот еще с outer join/null проверки:

select id, var1, var2 
from table1 
union all 
select t2.id, t2.var1, t2.var2 
from table2 t2 
    left join table1 t1 on t2.id = t1.id 
where t1.id is null 
+0

Спасибо большое! К сожалению, это решение не объединяет поля. id 2 имеет только информацию, указанную в таблице 1. –

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