powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Вычисляемое поле в запросе?
8 сообщений из 8, страница 1 из 1
Вычисляемое поле в запросе?
    #32448974
ku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ku
Гость
Есть таблица:
CREATE TABLE doc (
id INTEGER PRIMARY KEY NOT NULL,
pid INTEGER, -- parent id
path VARCHAR(128) NOT NULL,
descr TEXT
);
CREATE INDEX doc_parent ON doc (pid);

Нужно найти документы, имеющие заданного родителя, а также узнать имеют ли они, в свою очередь, детей.
Можно ли обойтись одним запросом?
--
SELECT id, path, descr, (???) as is_parent FROM doc WHERE pid = 7

Спасибо.
...
Рейтинг: 0 / 0
Вычисляемое поле в запросе?
    #32449011
bas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
SELECT d1.id, d1.path, d1.descr, d2.id, d2.path, d2.descr
FROM doc d1, doc d2
WHERE d1.pid =  7  
  and d1.id = d2.pid(+)
...
Рейтинг: 0 / 0
Вычисляемое поле в запросе?
    #32449038
ku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ku
Гость
> and d1.id = d2.pid(+)
У док-та может и не быть детей. А что значит (+)?
...
Рейтинг: 0 / 0
Вычисляемое поле в запросе?
    #32449117
bas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У док-та может и не быть детей. А что значит (+)?


outer join
...
Рейтинг: 0 / 0
Вычисляемое поле в запросе?
    #32450772
ku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ku
Гость
select * from doc;
---
id pid path descr
---
1 0 snip SNIP
2 0 gost GOST
3 2 gost/1 GOST_1
4 3 gost/1/1 GOST_1_1
5 2 gost/2 GOST_2

SELECT d1.id, d1.path, d1.descr, d2.pid
FROM doc d1 OUTER JOIN doc d2
WHERE d1.pid = 2 and d1.id = d2.pid;
---
3 gost/1 GOST_1 3

Не хватает:
5 gost/2 GOST_2 ?

След. вариант работает, но не слишком ли криво?
SELECT id, path, descr, 1 as sub FROM doc
WHERE pid = 2 AND id IN (SELECT pid FROM doc)
UNION
SELECT id, path, descr, NULL as sub FROM doc
WHERE pid = 2 AND id NOT IN (SELECT pid FROM doc)
...
Рейтинг: 0 / 0
Вычисляемое поле в запросе?
    #32450894
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ku
Что хранится в поле Path ? Весь путь от предка до последнего родителя ? Но с другой стороны в приведенном примере меня смутило значение поля Path:
4 3 gost/1/ 1 GOST_1_1
по идее должно быть
4 3 gost/1/ 3 GOST_1_1
Если поле Path действительно хранит то, что я думаю, то обычный LIKE 'ПутьРодителя\%' поможет сделать все, что Вы хотите.
...
Рейтинг: 0 / 0
Вычисляемое поле в запросе?
    #32451366
ku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ku
Гость
> Если поле Path действительно хранит то, что я думаю,
> то обычный LIKE 'ПутьРодителя\%' поможет сделать все, что Вы хотите.
Да, сперва так и хотел сделать. И хранить просто путь с описанием без всяких id.
Но LIKE 'ПутьРодителя\%' вернёт все подуровни, а мне нужен только один нижний уровень.
...
Рейтинг: 0 / 0
Вычисляемое поле в запросе?
    #32451398
bas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
I take following results at Oracle 8.1.7:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
CREATE TABLE doc ( 
id INTEGER PRIMARY KEY NOT NULL, 
pid INTEGER,  -- parent id 
 
path VARCHAR( 128 ) NOT NULL, 
descr VARCHAR( 128 )
); 


insert into doc values( 1 ,  0 , 'snip', 'SNIP') 
insert into doc values( 2 ,  0 , 'gost', 'GOST'); 
insert into doc values( 3 ,  2 , 'gost/1', 'GOST_1'); 
insert into doc values( 4 ,  3 , 'gost/1/1', 'GOST_1_1'); 
insert into doc values( 5 ,  2 , 'gost/2', 'GOST_2');

SELECT d1.id, d1.path, d1.descr, d2.id, d2.path, d2.descr
FROM doc d1, doc d2
WHERE d1.pid =  2  
  and d1.id = d2.pid(+) ;

Results:
 3 	gost/ 1 	GOST_1	 4 	gost/ 1 / 1 	GOST_1_1
 5 	gost/ 2 	GOST_2			




...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Вычисляемое поле в запросе?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]