Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Запрос по одной таблице / 25 сообщений из 27, страница 1 из 2
23.08.2002, 10:02:43
    #32045413
Ната
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос по одной таблице
Ребят, пожалуйста, помогите написать запрос по следующей проблеме...

Есть таблица полями: ID (автоинкрементным идентификатором) и ID2 (идентификатором родителя, если он есть - может быть = null, то есть нет родителя).
Надо построить ветку дерева.
Вроде все просто, но запуталась, тем более что только начала изучать.
...
Рейтинг: 0 / 0
23.08.2002, 10:36:22
    #32045426
Maxx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос по одной таблице
Ната сейчас утро:))
Что вы хотите получить на выходе,а то я никак не пойму:(
...
Рейтинг: 0 / 0
23.08.2002, 11:02:52
    #32045438
Ната
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос по одной таблице
Я не знаю как сформулировать правильно...
Лучше пример таблицы из 7 записей приведу:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
ID   ID2
 1     null
 2     null
 3      2 
 4      3 
 5     null
 6      2 
 7      1 


Ответ должен быть таким (по ID):
1
7
2
3
4
6
5

Вроде сказали использовать join по одной таблице - все перепробовала - ничего не выходит!
Короче, совсем не знаю, что делать, то ли я совсем тупая, то ли одно из двух :-)
...
Рейтинг: 0 / 0
23.08.2002, 11:11:34
    #32045442
Зайцев Фёдор
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос по одной таблице
Может быть
1
7
2
3
6
4
5

?
...
Рейтинг: 0 / 0
23.08.2002, 11:15:38
    #32045444
Maxx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос по одной таблице
Ната ,а где закономерность?
1 null
7 1
2 null
3 2
4 3
6 2
5 null
Страновато,не кажется?
...
Рейтинг: 0 / 0
23.08.2002, 11:18:21
    #32045446
snake
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос по одной таблице
провокация???
...
Рейтинг: 0 / 0
23.08.2002, 11:32:08
    #32045455
Ната
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос по одной таблице
Ну не знаю, может я в SQL пока плохо разбираюсь, но я написала правильно - ведь это по сути сортировка форумных записей - выстраивание их деревом! (Если есть у записи родитель - то под родителя ее и писать, а родители - по порядку)
...
Рейтинг: 0 / 0
23.08.2002, 11:41:05
    #32045461
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос по одной таблице
Утро, народ развлекается :)\r
\r
А по поводу вопроса посмотри здесь\r
\r
/topic/10197\r
\r
Ответ SergSuper от 24 июл 02, 11:29
...
Рейтинг: 0 / 0
23.08.2002, 11:41:20
    #32045462
Владимир Смирнов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос по одной таблице
Сделайте поиск слова "деревья" по форуму, узнаете много интересного.
А так, одним запросом - не сделать.
...
Рейтинг: 0 / 0
23.08.2002, 12:03:23
    #32045468
Ната
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос по одной таблице
Я посмотрела ответ ВладимирМ
Я в прострации :-(
А что же делать?
А можно как-нибудь обойти эту ситуацию?
Ввести новую таблицу, или новые поля?

Помогите, пожалуйста...
...
Рейтинг: 0 / 0
23.08.2002, 12:09:58
    #32045470
Maxx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос по одной таблице
А собственно чем вам алгоритм не нравиться,а одним запросом так вам уже ответили - неполучится.
...
Рейтинг: 0 / 0
23.08.2002, 12:17:16
    #32045473
Jimmy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос по одной таблице
Для данного случая ИМХО так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
create table tree (id int, id2 int null)
go
insert tree values ( 1 , null)
insert tree values ( 2 , null)
insert tree values ( 3 ,  2 )
insert tree values ( 7 ,  1 )
insert tree values ( 4 ,  3 )
insert tree values ( 5 , null)
insert tree values ( 6 ,  2 )
go
select id, id as id2 from tree where coalesce(id2, - 1  ) = - 1 
union
select * from tree where coalesce(id2, - 1  ) >  0 
order by  2 , 1 
go
...
Рейтинг: 0 / 0
23.08.2002, 12:39:05
    #32045484
Maxx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос по одной таблице
Хорошо, приношу свои извинения
...
Рейтинг: 0 / 0
23.08.2002, 12:44:28
    #32045487
Ната
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос по одной таблице
2 Maxx
"Нравиться - не нравиться" я смогу ответить когда разберусь с SQL (это, наверное, минимум через пару лет - а у меня в понедельник экзамен)

2 Jimmy
А если записей - 1000? Как нибудь в цикле?
У меня задание - запрос сделать из ASP...
...
Рейтинг: 0 / 0
23.08.2002, 12:46:47
    #32045491
Jimmy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос по одной таблице
2 Nata

Извините - не понял вопроса. Что в цикле?
...
Рейтинг: 0 / 0
23.08.2002, 12:51:33
    #32045492
Maxx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос по одной таблице
Ната ,простите но я совершенно не хотел Вас обидеть
ЗЫ
присоеденяюсь к Jimmy - зачем цикл?
...
Рейтинг: 0 / 0
23.08.2002, 13:13:54
    #32045510
Ната
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос по одной таблице
Про цикл - это я стормозила :-)

2 Jimmy - все прекрасно, но у меня на самом деле есть третье поле - текстовое, именно которое надо выводить, и в твоем примере тогда получается ошибка Distinct-а...

Что делать?
...
Рейтинг: 0 / 0
23.08.2002, 13:31:31
    #32045516
Jimmy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос по одной таблице
Если так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
ID   ID2   MSG
 1     null   Topic # 1 
 2     null   Topic # 2 
 3      2       Topic # 2 
 4      3       Topic # 2 
 5     null   Topic # 5 
 6      2       Topic # 2 
 7      1       Topic # 1 

то
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
alter table Tree add msg char( 20 )
go
update tree set 
    msg=case when coalesce(id2, - 1 )= -  1  then 'Topic #' + cast(id as char( 2 ))
        else 'Topic #' + cast(id2 as char( 2 ))
        end
go
select id, id as id2, msg from tree where coalesce(id2, - 1  ) = - 1 
union
select * from tree where coalesce(id2, - 1  ) >  0 
order by  2 , 1 
go


иначе - приведи пример.
...
Рейтинг: 0 / 0
23.08.2002, 13:46:48
    #32045521
Ната
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос по одной таблице
Все правильно, но только поле - должно быть текстовое (до 1000 символов - я так думаю только тип - Text), а не символьное :-(

Ошибка дистинкта...

Вопрос: как ее обойти?
...
Рейтинг: 0 / 0
23.08.2002, 13:49:36
    #32045522
Jimmy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос по одной таблице
2 Ната

Вот фрагмент BOL:

char and varchar
Fixed-length (char) or variable-length (varchar) character data types.

char[(n)]

Fixed-length non-Unicode character data with length of n bytes. n must be a value from 1 through 8,000 . Storage size is n bytes. The SQL-92 synonym for char is character.

varchar[(n)]

Variable-length non-Unicode character data with length of n bytes. n must be a value from 1 through 8,000 . Storage size is the actual length in bytes of the data entered, not n bytes. The data entered can be 0 characters in length. The SQL-92 synonyms for varchar are char varying or character varying.


8000 байт хватит? :0)
...
Рейтинг: 0 / 0
23.08.2002, 13:50:24
    #32045523
Владимир Смирнов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос по одной таблице
To Maxx.
Зря Вы насчёт закономерности. Ничего странного. Простое правило:
1.Родитель,
2.Если есть дети, после родителя сразу дитя.
Т.о., если детёныш сам родитель - см. пункт 2.
Вот после 3 и идёт 4, ведь его родитель 3.
А реализовать при такой структуре таблицы одним запросом не получится.
...
Рейтинг: 0 / 0
23.08.2002, 13:58:26
    #32045529
Ната
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос по одной таблице
Прошу прощения, я описалась - 10000 знаков (это больше чем 8K - я читала)

Чтобы делать сортировку с Text, я так понимаю надо проштудировать все труды, ссылки на которые здесь давали. Короче: неуспею...

Поэтому вопрос, как сделать "искуственно" - симуляцию текстового поля?
Это последний вопрос - я уже выдохлась, сил останеться только на благодарности всем, кто помог :)
...
Рейтинг: 0 / 0
23.08.2002, 14:05:23
    #32045535
Ната
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос по одной таблице
2 Владимир Смирнов

А при какой структуре (исходя из моих 3-х полей) можно упростить все запросы, и если не сложно, то как они будут выглядеть?
...
Рейтинг: 0 / 0
23.08.2002, 14:09:55
    #32045538
Jimmy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос по одной таблице
2 Ната

Тогда нужно написать хранимую процедуру:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
create procedure usp_GetTreeMsg
    as
begin
     /* выборка id */ 
     /* 
    тут нужно проверить существование временной таблы 
    и удалить, если она есть. Как - не помню сейчас.   
    Посмотри на форуме. 
    */ 
    select id, id as id2 into #temp1 from tree where coalesce(id2, - 1  ) = - 1 
    union
    select * from tree where coalesce(id2, - 1  ) >  0 
    order by  2 , 1 

     /* "подключение" текста;
        условие - уникальность id */ 
    select t1.id, t1.id2, t2.msg 
        from #temp1 t1, tree t2
        where t2.id = t1.id

     /* удалим времянку */ 
    drop table #temp1
end


А в ASP скрипте вызывать эту процедуру вместо текста запроса.
...
Рейтинг: 0 / 0
23.08.2002, 14:21:47
    #32045544
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос по одной таблице
По поводу способов хранения древовидной структуры посмотри варианты:

http://www.osp.ru/win2000/sql/967.htm
http://sdm.viptop.ru/articles/sqltrees.html
http://rdbms.narod.ru/article/tree/index.html

Это все на будущее. В той постановке что у тебя простого ответа не будет.

В самом простом случае, тебе необходимо ввести еще одно поле, содержащее сквозной порядковый номер каждого узла по всему дереву.

Естесственно, это поле усложнит модификацию дерева, но требуемый тебе запрос ты будешь получать мгновенно, просто поставив опцию ORDER BY nOrder (nOrder - это то самое, дополнительное поле)
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Запрос по одной таблице / 25 сообщений из 27, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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