Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Self join с полем по параметру 
:(
    Опции темы
Хоббит
Дата 26.1.2012, 09:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1263
Регистрация: 6.11.2005

Репутация: нет
Всего: 1



К примеру такая таблица
Код

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

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



Это сообщение отредактировал(а) Хоббит - 26.1.2012, 09:30
PM MAIL   Вверх
Zloxa
Дата 26.1.2012, 09:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 53
Всего: 161



Цитата(Хоббит @  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

Это сообщение отредактировал(а) Zloxa - 26.1.2012, 09:59


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Хоббит
Дата 26.1.2012, 10:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1263
Регистрация: 6.11.2005

Репутация: нет
Всего: 1



А теперь маленькое добавление. Все это в MySQL
PM MAIL   Вверх
Zloxa
Дата 26.1.2012, 10:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 53
Всего: 161



Код

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




--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Составление SQL-запросов | Следующая тема »


 




[ Время генерации скрипта: 0.0906 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.