Выберите союз с условием где, в то время как столбцы имеют разные имена

0

Сценарий:

Таблица 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
}}

Обновить

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

  • 0 - 1k строк: подзапрос ~ 20% медленнее.
  • 1k - 100k строк: TODO
  • 0
    SELECT city_id AS 'id', city_name AS 'name' FROM table1 возвращает только имена id и города из таблицы 1, поэтому: "this query returns only data from 1st table."
  • 0
    Отредактируйте свой вопрос и покажите нам, что вы ожидаете в результате
Теги:
union
union-all

1 ответ

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

  • 0
    так просто, я чувствую себя глупым Вопрос: Если бы обе таблицы имели одинаковые имена столбцов, мой запрос1 работал бы, как ожидалось, или мне все равно нужно было бы указать WHERE в обоих запросах?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню