Выберите союз с условием где, в то время как столбцы имеют разные имена - PullRequest
0 голосов
/ 04 июля 2018

Сценарий:

Table1:

city_id     |   city_name       | ...
-------------------------------------
1           |   Aaaa
2           |   Bbb
3           |   Ccc
4           |   Ddd
...

Table2:

region_id   |   region_name     | ...
-------------------------------------
1001        |   Qwer
1002        |   Zxcv
1003        |   Vbnm
...

Ожидаемый результат:

id          |   name     | ...
-------------------------------------
3           |   Ccc
4           |   Ddd
1001        |   Qwer
1002        |   Zxcv
1003        |   Vbnm
...

Идентификаторы гарантированно будут разными в двух таблицах.

Я хочу выбрать обе таблицы с объединением (так как они были 1 отдельной таблицей), а затем использовать 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

Но этот запрос возвращает только данные из первой таблицы.

Я только что увидел, что один из способов добиться этого - заключить союз в выборку.

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
}}

обновление

Сравнение подзапроса и принятого ответа

  • 0 - 1 тыс. Строк: подзапрос работает на 20% медленнее.
  • 1k - 100k строк: TODO

1 Ответ

0 голосов
/ 04 июля 2018

Вы можете добавить одно и то же предложение 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, и в столбцах идентификаторов есть индексы, вы можете не воспользоваться этими индексами. Но вы должны проверить план выполнения, чтобы увидеть, правильно ли оптимизатор идентифицирует этот случай и идет по индексу или нет.

...