Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Помогите с запросом  [new]
StasL
Member

Откуда: г. Москва
Сообщений: 116
Добрый день, всем.
Есть таблица
ID PARENT col1 col2
1 100 1
2 101 1
3 102 2
4 102 103 2
5 104 3
6 104 105 4

WITH t AS (SELECT 1 ID, NULL PARENT, 100 col1, 1 col2 FROM dual
 UNION ALL SELECT 2 , NULL, 101, 1 FROM dual
 UNION ALL SELECT 3 , NULL, 102, 2 FROM dual
 UNION ALL SELECT 4 , 102, 103, 2 FROM dual
 UNION ALL SELECT 5 , NULL, 104, 3 FROM dual
 UNION ALL SELECT 6 , 104, 105, 4 FROM dual
)
SELECT * FROM t

Нужно получить
ID CONNECT_BY_ISLEAF1 PARENT col1 col2
1 1 100 1
2 1 101 1
3 0 102 2
5 1 104 3
6 1 104 105 4


т.е. если значение в поле Col2 у пары корень-лист одинаково, то поле CONNECT_BY_ISLEAF1 у корня ставим в 0 и листья не показываем,
а если НЕ равно, то CONNECT_BY_ISLEAF1 и у корня и у листа = 1 и лист показваем.

Подскажите, пожалуйста, как это сделать, чего-то не могу сообразить.
4 окт 10, 11:24    [9547061]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
-2-
Member

Откуда:
Сообщений: 15330
StasL
чего-то не могу сообразить.
ЦРУКУ
4 окт 10, 11:41    [9547196]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
rip2vip
Member

Откуда:
Сообщений: 1
WITH t AS (SELECT 1 ID, NULL PARENT, 100 col1, 1 col2 FROM dual
 UNION ALL SELECT 2 , NULL, 101, 1 FROM dual
 UNION ALL SELECT 3 , NULL, 102, 2 FROM dual
 UNION ALL SELECT 4 , 102, 103, 2 FROM dual
 UNION ALL SELECT 5 , NULL, 104, 3 FROM dual
 UNION ALL SELECT 6 , 104, 105, 4 FROM dual
)
, tt as (SELECT 	id,parent,col1,col2,connect_by_isleaf cbi 	FROM t
	start with parent is null
	connect by prior col1=parent)
select id,decode(cbi+connect_by_isleaf,0,1,cbi) c,parent,col1,col2 
from tt
start with parent is null
connect by prior col1=parent
and prior col2!=col2
/
?
4 окт 10, 12:01    [9547393]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
dbms_photoshop
Member

Откуда: sqlmdx.net
Сообщений: 5151
StasL
если значение в поле Col2 у пары корень-лист одинаково, то поле CONNECT_BY_ISLEAF1 у корня ставим в 0 и листья не показываем
А если с одним листом совпадает а с другим нет?
WITH t AS (SELECT 1 ID, NULL PARENT, 100 col1, 1 col2 FROM dual
 UNION ALL SELECT 2 , NULL, 101, 1 FROM dual
 UNION ALL SELECT 3 , NULL, 102, 2 FROM dual
 UNION ALL SELECT 4 , 102, 103, 2 FROM dual
 UNION ALL SELECT 5 , NULL, 104, 3 FROM dual
 UNION ALL SELECT 6 , 104, 105, 4 FROM dual
)
, t0 as
(
SELECT LEVEL l, PARENT, id, col1, col2, connect_by_root col1 root_col1
  FROM t
 START WITH PARENT IS NULL
CONNECT BY PRIOR col1 = PARENT
)
SELECT MIN(id) keep(dense_rank FIRST ORDER BY l) id,
       MIN(PARENT) keep(dense_rank FIRST ORDER BY l) PARENT,
       MIN(col1) keep(dense_rank FIRST ORDER BY l) col1,
       MIN(col2) keep(dense_rank FIRST ORDER BY l) col2
  FROM t0
 GROUP BY root_col1, col2
 ORDER BY 1
В решении предполагается, что корни - это те строки, для которых parent is null.
4 окт 10, 12:01    [9547395]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
StasL
Member

Откуда: г. Москва
Сообщений: 116
dbms_photoshop
StasL
если значение в поле Col2 у пары корень-лист одинаково, то поле CONNECT_BY_ISLEAF1 у корня ставим в 0 и листья не показываем
А если с одним листом совпадает а с другим нет?

Скажу по другому: лист у которого col2 НЕ равен его корню считается корнем. Показываем только все корни.

dbms_photoshop
В решении предполагается, что корни - это те строки, для которых parent is null.

Да, извините, сразу не уточнил.

Спасибо. Идея ясна, сейчас буду разбираться.
4 окт 10, 12:25    [9547619]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить