Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Составление SQL-запросов > Self join с полем по параметру


Автор: Хоббит 26.1.2012, 09:28
К примеру такая таблица
Код

id  flag  value
0   0      v_0_0
0   1      v_0_1
1   1      v_1_1
2   0      v_2_0
2   0      v_2_1
2   0      v_2_2
3   0      v_3_0
3   1      v_3_1
3   1      v_3_2
3   0      v_3_3


Необходимо получить
Код

id   v0         v1
0    v_0_0   v_0_1
1                 v_2_0   
2    v_2_0
3    v_3_0   v_3_1


То есть для каждого id должно быть 2 колонки v0 - если у него есть значение с flag = 0 и v1 если flag = 1.
Я понимаю что тут полное объединение таблицы с собой при определенном условие, но никак его не напишу.

Пробовал
Код

SELECT t1.id, t1.value, t2.value FROM t as t1 LEFT JOIN t as t2 ON (t1.id = t2.id) WHERE t1.flag = 0 AND t2.flag = 1 
UNION
... // Тут RIGHT JOIN

Так не выходит.


Автор: Zloxa 26.1.2012, 09:56
Цитата(Хоббит @  26.1.2012,  09:28 Найти цитируемый пост)
То есть для каждого id должно быть 2 колонки v0 - если у него есть значение с flag = 0 и v1 если flag = 1.

Код

select id
  ,min(case when flag = 0 then value end) v0
  ,min(case when flag = 1 then value end) v1
from t
group by id


Добавлено через 7 минут и 28 секунд
Цитата(Хоббит @  26.1.2012,  09:28 Найти цитируемый пост)
Я понимаю что тут полное объединение таблицы с собой при определенном условие, но никак его не напишу.

можно и full join'ом

Код

select coalesce(t0.id,t1.id) id
   ,t0.value v0
   ,t1.value v1
from (select * ftom t where flag = 0) t0
full join (select * from t where flag = 1) t1 on t0.id = t1.id


в этом случае для id = 3 будет возвращено 4 записи с разными комбинациями v0,v1

Автор: Хоббит 26.1.2012, 10:16
А теперь маленькое добавление. Все это в MySQL

Автор: Zloxa 26.1.2012, 10:28
Код

select t0.id id
   ,t0.value v0
   ,t1.value v1
from t t0
left join t t1 on t0.id = t1.id and  t1.flag = 1
where t0.flag=0
union all 
select t1.id id
   ,null v0
   ,t1.value v1
from t t1
left join t t0 on t0.id = t1.id and  t0.flag = 0
where t1.flag=1 and t0.id is null


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)