powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Почему рекурсивный запрос?
11 сообщений из 11, страница 1 из 1
Почему рекурсивный запрос?
    #39752189
Charles Weyland
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Самый каноничный рекурсивный запрос ниже.
Таблица представляет собой
id parent_id name1 1 Сделать отчёт в ворде2 1 открыть ворд3 1 написать текст4 3 подумать5 3 почесать и-нет6 1 закрыть ворд
Код: sql
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.
with Tree(Id, Parent_ID, Name, level, s)
AS
(
    select
        Id
        , Parent_ID
        , Name
        , 0
        , cast(id as nvarchar(500)) s 
    from tasks
    where Id=Parent_ID
    union all
    select
        a.Id
        , a.Parent_ID
        , a.Name
        , Tree.level+1
        , cast(a.id as nvarchar(500)) + '_' + cast(Tree.Id as nvarchar(500)) s
    from tasks a
    inner join Tree on Tree.Id = a.Parent_ID
    where a.id != a.Parent_ID
)
Select ID, space(level)+name
from Tree a
order by s


А ошибка у меня
Types don't match between the anchor and the recursive part in column "s" of recursive query "Tree".
Её не будет, если убрать столбец сортировки s . Я его сделал для того, чтобы можно было потом отсортировать по нему.
Как решить эту проблему?
...
Рейтинг: 0 / 0
Почему рекурсивный запрос?
    #39752192
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Charles WeylandКак решить эту проблему?Привести поля к одному типу.
id - целого типа? Тогда зачем длина строки 500? Целый тип никогда не превышает 11 символов, включая знак.
...
Рейтинг: 0 / 0
Почему рекурсивный запрос?
    #39752197
Charles Weyland
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iapCharles WeylandКак решить эту проблему?Привести поля к одному типу.
id - целого типа? Тогда зачем длина строки 500? Целый тип никогда не превышает 11 символов, включая знак.
все поля одного типа. Убираю выделенное красным и всё работает как должно.
не важно, почему там 500. Да хоть 5 напишу, хоть 10, хоть 100. Это не меняет сути.

Код: sql
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.
with Tree(Id, Parent_ID, Name, level, s)
AS
(
    select
        Id
        , Parent_ID
        , Name
        , 0
        , cast(id as nvarchar(500)) s 
    from tasks
    where Id=Parent_ID
    union all
    select
        a.Id
        , a.Parent_ID
        , a.Name
        , Tree.level+1
        , cast(a.id as nvarchar(500)) + '_' + cast(Tree.Id as nvarchar(500)) s
    from tasks a
    inner join Tree on Tree.Id = a.Parent_ID
    where a.id != a.Parent_ID
)
Select ID, space(level)+name
from Tree a
order by s
...
Рейтинг: 0 / 0
Почему рекурсивный запрос?
    #39752204
Посетитель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Charles Weylandiapпропущено...
Привести поля к одному типу.
id - целого типа? Тогда зачем длина строки 500? Целый тип никогда не превышает 11 символов, включая знак.
все поля одного типа. Убираю выделенное красным и всё работает как должно.
не важно, почему там 500. Да хоть 5 напишу, хоть 10, хоть 100. Это не меняет сути.

Код: sql
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.
with Tree(Id, Parent_ID, Name, level, s)
AS
(
    select
        Id
        , Parent_ID
        , Name
        , 0
        , cast(id as nvarchar(500)) s 
    from tasks
    where Id=Parent_ID
    union all
    select
        a.Id
        , a.Parent_ID
        , a.Name
        , Tree.level+1
        , cast(a.id as nvarchar(500)) + '_' + cast(Tree.Id as nvarchar(500)) s
    from tasks a
    inner join Tree on Tree.Id = a.Parent_ID
    where a.id != a.Parent_ID
)
Select ID, space(level)+name
from Tree a
order by s



как же это они у вас одного типа, если в первом случае у вас nvarchar(500)
а во втором nvarchar(500)+char+nvarchar(500)?
...
Рейтинг: 0 / 0
Почему рекурсивный запрос?
    #39752209
Charles Weyland
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
понял, спасибо.
Привёл тип cast для всего выражения. Всё работает.
...
Рейтинг: 0 / 0
Почему рекурсивный запрос?
    #39752215
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Charles Weyland,

во втором случае (теоретически) допускается, что текст будет 1000 юникодных символа?
А в первом - не более 500?
И вы при этом утверждаете, что это один и тот же тип?
Уж не гуманитарий ли вы? :))
...
Рейтинг: 0 / 0
Почему рекурсивный запрос?
    #39752419
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Посетитель,

'_' никак не NVARCHAR. N'_' - это NVARCHAR.
...
Рейтинг: 0 / 0
Почему рекурсивный запрос?
    #39752459
Charles Weyland
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iapCharles Weyland,

во втором случае (теоретически) допускается, что текст будет 1000 юникодных символа?
А в первом - не более 500?
И вы при этом утверждаете, что это один и тот же тип?
Уж не гуманитарий ли вы? :))
блин. Ну точно.
гуманитарий. Привёл всё к одной длине, заработало. Логично же блин..
...
Рейтинг: 0 / 0
Почему рекурсивный запрос?
    #39752608
Посетитель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав КолосовПосетитель,

'_' никак не NVARCHAR. N'_' - это NVARCHAR.

еще бы понять, на что же вы ответили.
...
Рейтинг: 0 / 0
Почему рекурсивный запрос?
    #39752622
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав КолосовПосетитель,

'_' никак не NVARCHAR. N'_' - это NVARCHAR.Неявное приведение типа.
Пример:
Код: sql
1.
SELECT SQL_VARIANT_PROPERTY(CAST(CAST('1234567890' AS NVARCHAR(10))+'_'+CAST('0987654321' AS NVARCHAR(10))AS SQL_VARIANT),'MaxLength');
...
Рейтинг: 0 / 0
Почему рекурсивный запрос?
    #39752696
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПосетительВладислав КолосовПосетитель,

'_' никак не NVARCHAR. N'_' - это NVARCHAR.

еще бы понять, на что же вы ответили.

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


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