Сценарий:
Таблица 1:
city_id | city_name | ...
-------------------------------------
1 | Aaaa
2 | Bbb
3 | Ccc
4 | Ddd
...
Таблица 2:
region_id | region_name | ...
-------------------------------------
1001 | Qwer
1002 | Zxcv
1003 | Vbnm
...
Ожидаемый результат:
id | name | ...
-------------------------------------
3 | Ccc
4 | Ddd
1001 | Qwer
1002 | Zxcv
1003 | Vbnm
...
Идентификаторы гарантированно отличаются друг от друга по 2 таблицам.
Я хочу выбрать обе таблицы с объединением (так как они были одной отдельной таблицей), а затем использовать WHERE
Query1
SELECT
city_id AS 'id',
city_name AS 'name'
FROM table1
UNION
SELECT
region_id AS 'id',
region_name AS 'name'
FROM table2
WHERE 'id' > 2
Но этот запрос возвращает только данные из 1-й таблицы.
Я только видел, что один из способов добиться этого - обернуть объединение в избранном.
Query2
SELECT * FROM (
SELECT
city_id AS 'id',
city_name AS 'name'
FROM table1
UNION
region_id AS 'id',
region_name AS 'name'
FROM table2
) AS t
WHERE t.id > 2
Есть ли солитон без использования подзапроса?
Если нет, то как влияет производительность при использовании подзапроса в этом случае (приблизительно)?
Бонусный вопрос
В query2, почему WHERE
применяется к первой таблице? Не должно быть что-то вроде:
{{
SELECT
city_id AS 'id',
city_name AS 'name'
FROM table1
}}
UNION
{{
SELECT
region_id AS 'id',
region_name AS 'name'
FROM table2
WHERE 'id' > 2
}}
Сравнение подзапроса и принятого ответа
Вы можете добавить одно и то же предложение WHERE к обоим запросам:
SELECT
city_id AS 'id',
city_name AS 'name'
FROM table1
WHERE city_id > 2
UNION
region_id AS 'id',
region_name AS 'name'
FROM table2
WHERE region_id > 2
;
Что касается вашего вопроса, связанного с производительностью, если предложение WHERE оценивается после оценки подзапроса UNION и наличия индексов в столбцах id, вы можете не воспользоваться индексами. Но вы должны проверить план выполнения, чтобы убедиться, что оптимизатор правильно идентифицирует этот случай и идет по индексу или нет.
WHERE
в обоих запросах?
SELECT city_id AS 'id', city_name AS 'name' FROM table1
возвращает только имена id и города из таблицы 1, поэтому:"this query returns only data from 1st table."