Възможно ли е да се опрости тази 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