Я хотел бы получить полный список из id
из нескольких таблиц, и они могут быть полностью перекрыты или взаимно исключены. Мне интересно, что будет иметь лучшую производительность, и это правильный способ для PostgreSQL, и почему это так?PostgreSQL: выберите отдельный id union vs. select id full join
Скажем, у меня есть 4 таблицы и таблицы оптимизированы с индексами:
[SELECT DISTINCT ... UNION]
SELECT DISTINCT id from table1
UNION
SELECT DISTINCT id from table2
UNION
SELECT DISTINCT id from table3
UNION
SELECT DISTINCT id from table4
;
[SELECT ... ПОЛНЫЙ РЕГИСТРИРУЙТЕСЬ]
SELECT DISTINCT coalesce(a.id, b.id, c.id, d.id) AS id
FROM table1 a
FULL JOIN table2 b on a.id=b.id
FULL JOIN table3 c on b.id=c.id
FULL JOIN table4 d on c.id=d.id
;
Сделано некоторые корректировки здесь. Благодаря предложению @ Хогана в его ответе.
Примечание
Моя вся мотивация для full join
потому, что id
поля может быть полностью перекрывается между таблицами. full join
может облегчить некоторые сканированные таблицы.
это не то же самое. – Hogan
Нет необходимости в отличии от 'UNION'. 'UNION' возвращает разные значения. 'UNION ALL' возвращает все значения – lad2025
@ lad2025. , , Нет необходимости, но есть случаи, когда он может создать более эффективный план выполнения (а именно, когда индекс может использоваться для 'distinct' в подзапросе). Тем не менее, эти два вопроса не являются эквивалентными, поэтому я сомневаюсь, что ОП осознает этот нюанс. –