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

Есть таблица полями: ID (автоинкрементным идентификатором) и ID2 (идентификатором родителя, если он есть - может быть = null, то есть нет родителя).
Надо построить ветку дерева.
Вроде все просто, но запуталась, тем более что только начала изучать.
...
Рейтинг: 0 / 0
Запрос по одной таблице
    #32045426
Фотография Maxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ната сейчас утро:))
Что вы хотите получить на выходе,а то я никак не пойму:(
...
Рейтинг: 0 / 0
Запрос по одной таблице
    #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
Запрос по одной таблице
    #32045442
Зайцев Фёдор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может быть
1
7
2
3
6
4
5

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

Помогите, пожалуйста...
...
Рейтинг: 0 / 0
Запрос по одной таблице
    #32045470
Фотография Maxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А собственно чем вам алгоритм не нравиться,а одним запросом так вам уже ответили - неполучится.
...
Рейтинг: 0 / 0
Запрос по одной таблице
    #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
Запрос по одной таблице
    #32045484
Фотография Maxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хорошо, приношу свои извинения
...
Рейтинг: 0 / 0
Запрос по одной таблице
    #32045487
Ната
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 Maxx
"Нравиться - не нравиться" я смогу ответить когда разберусь с SQL (это, наверное, минимум через пару лет - а у меня в понедельник экзамен)

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

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

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

Что делать?
...
Рейтинг: 0 / 0
Запрос по одной таблице
    #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
Запрос по одной таблице
    #32045521
Ната
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Все правильно, но только поле - должно быть текстовое (до 1000 символов - я так думаю только тип - Text), а не символьное :-(

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

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

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

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

А при какой структуре (исходя из моих 3-х полей) можно упростить все запросы, и если не сложно, то как они будут выглядеть?
...
Рейтинг: 0 / 0
Запрос по одной таблице
    #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
Запрос по одной таблице
    #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
25 сообщений из 27, страница 1 из 2
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Запрос по одной таблице
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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