sql объединить два результата запроса на выбор, сохранить результат из запроса A, если есть конфликт в значении одного столбца - PullRequest
1 голос
/ 07 мая 2020

набор результатов 1:

id  | animal
1   | panda
2   | duck 

набор результатов 2:

id  | animal
1   | horse
3   | dog 

желаемый результат после слияния

id  | animal
1   | panda
2   | duck 
3   | dog

есть ли лучший способ чем проверить, существует ли идентификатор первым при выборе 2-го?

Ответы [ 3 ]

1 голос
/ 07 мая 2020

Вы можете сделать это с помощью not exists:

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

Было бы интересно сравнить производительность этой версии с производительностью версии full join. планы объяснения двух методов удивительно интересны.

Без каких-либо первичных ключей в таблицах эта версия намного, намного быстрее, чем версия full join. С первичными ключами full join работает немного быстрее. В обоих случаях union all должен быстрее возвращать первую строку.

Я не понимаю, что план для not exists версии без первичных ключей: быстрее чем версия с первичными ключами. Тайны оптимизаторов баз данных.

1 голос
/ 07 мая 2020

Это выглядит как full join и coalesce() для приоритета:

select id, coalesce(t1.animal, t2.animal) animal
from table1 t1 full join
     table2 t2 
     using (id)
0 голосов
/ 07 мая 2020

Просто объедините сначала все два, затем сгруппируйте, имея count ()> 1

    Select * from(  Select distinct id, 
       animal from table
      Union all
     Select distinct id, animal from table) 
    Group by id, animal having count(*) 
     >1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...