Можно ли упростить этот запрос SQL UNION?

Можно ли упростить этот UNION, чтобы избежать почти избыточности объединяемых запросов? Как видно здесь, оба запроса похожи. Они просто присоединяются к другому столбцу в таблице 2. Причина, по которой я использую Union, а не просто Inner Joining 2x в том же запросе, заключается в том, что результаты должны быть в 1 столбце в силу того факта, что эти запросы используются как подзапросы.

SELECT t1.id as id
FROM table1 g
INNER JOIN table2 t1 on g.t_id = t1.id
WHERE g.id=1
UNION
SELECT t2.id as id2
FROM table1 g
INNER JOIN table2 t2 on g.t2_id = t2.id
WHERE g.id=1

person glutz    schedule 08.09.2012    source источник
comment
Это очень похоже на ваш предыдущий вопрос. Что отличается?   -  person Kermit    schedule 09.09.2012
comment
разница в том, что предложение where здесь такое же. Внутреннее соединение отличается. Один и тот же ответ не подходит для обоих вопросов.   -  person glutz    schedule 09.09.2012


Ответы (3)


Я не понимаю, почему это нельзя рассматривать как простое внутреннее соединение, которое может быть удовлетворено совпадением любого из двух предикатов. Я удалил исходные псевдонимы таблиц t1, t2 и g для ясности. Поскольку я не знаю, может ли запрос создавать повторяющиеся строки, я использовал DISTINCT, чтобы свернуть повторяющиеся строки таким же образом, как UNION в исходном запросе.

SELECT DISTINCT table2.id
FROM table1
INNER JOIN table2
ON ( table1.t_id = table2.id OR table1.t2_id = table2.id )
WHERE table1.id = 1
;
person Fred Sobotka    schedule 09.09.2012

Можно обойтись двумя соединениями и функцией IFNULL():

SELECT IFNULL (t1.id, t2.id) as id
FROM table1 g
INNER JOIN table2 t1 on g.t_id = t1.id
INNER JOIN table2 t2 on g.t2_id = t2.id
WHERE g.id=1
person tpolyak    schedule 08.09.2012
comment
Этот запрос не будет давать те же результаты, что и исходный запрос, поскольку он требует, чтобы оба соединения были успешными, чтобы появиться в наборе результатов. Исходный запрос выдаст строку, если будет выполнено одно из условий соединения. - person Fred Sobotka; 09.09.2012

Вы можете найти это проще:

select distinct t.id
from table2 t
where t.id in (select g.t_id from table1 g) or
      t.id in (select g.t2_id from table1 g)

Однако производительность на MySQL будет ужасной. Вы также можете сделать:

select distinct t.id
from table2 t
where exists (select 1 from table1 g where g.t_id = t.id or g.t2_id = t.id)

Вторая версия должна лучше работать в MySQL.

person Gordon Linoff    schedule 08.09.2012
comment
ни один не учитывает g.id = 1 - person glutz; 09.09.2012