Типы не совпадают между привязкой и рекурсивной частью

#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