Общий поиск в обход union

Boleon

Например у нас есть:
SELECT v1.field1, v1.field2, v1.field3
FROM example.table1 v1
WHERE v1.field1 = 1
UNION
SELECT v2.field1, v2.field2, v2.field3
FROM example.table2 v2
WHERE v2.field1 = 1
UNION
SELECT v3.field1, v3.field2, v3.field3
FROM example.table3 v3
WHERE v3.field1 = 1
как нам из этого сделать только один общий where field1 = 1 из 3 таблиц?Разобрался, для этого нужно сделать:
SELECT field1, field2, field3
FROM   (SELECT v1.field1, v1.field2, v1.field3
        FROM example.table1 v1
        UNION
        SELECT v2.field1, v2.field2, v2.field3
        FROM example.table2 v2
        UNION
        SELECT v3.field1, v3.field2, v3.field3
        FROM example.table3 v3)
WHERE field1 = 1
2 ответа

Boleon

Если в таблицах по 100500 записей то это не лучшее решение


Boleon

Использовать union предпочтительнее чем объединять таблицы, а потом фильтровать, больше того,в некоторыхслучаях union даже лучше условия OR (если условие OR проверяет данные разных столбцов или таблиц - может выполнится вход не по индексу, или не по тому индексу). Посмотрите план второго запроса, ораклу придется сделать full scan по всем трем таблицам даже если фильтруемое поле проиндексировано.