CTE уходит в бесконечность l oop? - PullRequest
0 голосов
/ 13 апреля 2020

У меня есть такая структура таблицы

enter image description here

Где я хочу повторяться до if(text_id = new_text_id). Итак, предположим, что я передаю 1 как text_id Я хочу получить взамен 5 как text_id, используя CTE.

Я пытался, но он идет бесконечно l oop, пробовал maxrecursion все еще

WITH textHierarchy AS (
    SELECT tm.text_id
    FROM text_master tm 
    WHERE tm.text_id = 1

    UNION ALL

    SELECT tm.text_id
    FROM text_master as tm
    JOIN textHierarchy AS txtHr ON tm.text_id = txtHr.new_text_id -- Terminating Condition
    WHERE txtHr.new_text_id IS NOT NULL 

)
SELECT * FROM textHierarchy option (maxrecursion 5);

Пожалуйста, скажите мне, что я делаю неправильно.

Моя цель - использовать этот CTE внутри функции базы данных и вызывать эту функцию из Java.

И можно ли использовать CTE внутри функции. Если так, то как?

Ответы [ 3 ]

1 голос
/ 13 апреля 2020
create table dbo.text_master_test
(
text_id int,
text_details nvarchar(max),
new_text_id int
)
go

insert into text_master_test
values(1, 'det 1',2), (2, 'det 2',3), (3, 'det 3',4), (4, 'det 4',5), (5, 'det 5',5);
go


WITH textHierarchy AS (
    SELECT tm.text_id, tm.new_text_id, nullif(tm.new_text_id, tm.text_id) as next_text_id
    FROM text_master_test tm 
    WHERE tm.text_id = 1
    UNION ALL
    SELECT tm.text_id, tm.new_text_id, nullif(tm.new_text_id, tm.text_id) as next_text_id
    FROM text_master_test as tm
    JOIN textHierarchy AS txtHr ON tm.text_id = txtHr.next_text_id 

)
SELECT * FROM textHierarchy;
go


create function dbo.textrecursion(@start_text_id int)
returns table
as
return
(
WITH textHierarchy 
AS 
(
    SELECT tm.text_id, tm.text_details, tm.new_text_id, 
        nullif(tm.new_text_id, tm.text_id) as next_text_id
    FROM dbo.text_master_test tm 
    WHERE tm.text_id = @start_text_id
    UNION ALL
    SELECT tm.text_id, tm.text_details, tm.new_text_id,
        nullif(tm.new_text_id, tm.text_id) as next_text_id
    FROM dbo.text_master_test as tm
    JOIN textHierarchy AS txtHr ON tm.text_id = txtHr.next_text_id 
)
select text_id, text_details, new_text_id
from textHierarchy
);
go

select *
from dbo.textrecursion(1)

select *
from dbo.textrecursion(4)

select *
from dbo.textrecursion(5)
go

drop function dbo.textrecursion;
go
drop table dbo.text_master_test
go
0 голосов
/ 13 апреля 2020

Можете ли вы попробовать этот запрос ниже. Я передал text_id = 1

;WITH Numbers(text_id) AS
(
    SELECT text_id
    from rectab
    where text_id=1
    UNION ALL
    SELECT text_id
    FROM rectab
    WHERE text_id=new_text_id
)
SELECT text_id
FROM Numbers;
0 голосов
/ 13 апреля 2020

То, что вы прокомментировали как условие прекращения, не таково. Это условие соединения, которое определяет отношение между текущей итерацией и следующей.

Я думаю, что вы хотите:

WITH textHierarchy AS (
    SELECT tm.text_id
    FROM text_master tm 
    WHERE tm.text_id = 1

    UNION ALL

    SELECT tm.text_id
    FROM text_master as tm
    JOIN textHierarchy AS txtHr ON tm.text_id = txtHr.new_text_id 
    WHERE txtHr.text_id <> txtHr.new_text_id -- Termination condition

)
SELECT * FROM textHierarchy option (maxrecursion 5);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...