#sql #sql-server #common-table-expression
#sql #sql-сервер #common-table-expression
Вопрос:
Я выполняю следующий запрос :
WITH rg(id, childid, NAME)
AS (SELECT id,
0 ChildID,
NAME
FROM kuaf
WHERE id = 1000
UNION ALL
SELECT c.id,
c.childid,
k.NAME
FROM kuafchildren c
JOIN rg p
ON ( c.childid = p.id )
JOIN kuaf k
ON ( c.id = k.id ))
SELECT DISTINCT ka.id
FROM rg,
lm_approvals app
JOIN kuaf ka
ON ( ka.id = app.useridentifier )
JOIN dtree dt
ON ( dt.dataid = app.dataid )
WHERE app.dataid = 25773
AND app.isapproved = 0
AND Replace(ka.NAME, ka.type '_', dt.ownerid '_') = rg.NAME
Но я заканчиваю со следующей ошибкой:
Типы не совпадают между привязкой и рекурсивной частью в столбце «childID» рекурсивного запроса «rg».
Комментарии:
1. Ваш вопрос было бы легче понять, если бы вы нашли время для правильного форматирования вашего SQL.
Ответ №1:
Если вы измените первый SELECT или часть привязки resursive CTE следующим образом, это будет работать
SELECT id,
CAST(0 as int) ChildID,
NAME
FROM kuaf
WHERE id = 1000
Это тот случай, с которым мы обычно сталкиваемся, когда на этом шаге выбирается пустая строка или значение NULL.
Поэтому для CTE требуется явное определение типа при выборе привязки
Ответ №2:
Я сам этого не пробовал, судя по документации, необходимо явно преобразовать тип 0, например kuafchildren.childid, через ПРИВЕДЕНИЕ ( выражение КАК data_type [ (длина ) ] )
или ПРЕОБРАЗОВАНИЕ ( data_type [ (длина) ] , выражение [ , стиль ] )
выражение — 0 data_type [ (длина ) ] )то же, что kuafchildren.childid
Вы можете попробовать написать вместо 0 дочерний идентификатор kuaf.id *0 Дочерний идентификатор Это может сработать, если kuaf.id введите то же, что и kuafchildren.childid
Ответ №3:
Попробуйте это…
;WITH CTE RG AS (
SELECT Id,
0 AS 'ChildId',
Name
FROM Kuaf
WHERE id = 1000
UNION ALL
SELECT C.Id,
C.ChildId,
C.Name
FROM KuafChildren C
INNER JOIN RG ON (C.ChildId = RG.ChildId)
)
SELECT ...
Я предполагаю, что тип данных столбца childID равен int