CTE в функцию - PullRequest
       22

CTE в функцию

0 голосов
/ 24 мая 2019

Я хочу создать функцию, которая должна содержать CTE.

CTE работает очень хорошо.Дело в том, что я не могу вмешиваться в эту функцию.Мой CTE позволяет перечислять конфигурации в диапазоне дат

Я хотел бы знать, как поместить связь между CTE и функцией

CREATE FUNCTION dbo.ftliste_NameId
    (@dateStart DATETIME, 
     @dateEnd DATETIME)
RETURNS TABLE
AS 
    RETURN
        (WITH List AS 
         (
              SELECT DISTINCT 
                  CASE 
                     WHEN RG.Name IS NULL 
                        THEN R1.Id 
                        ELSE NULL 
                     END as Id,
                     RG.name  
                 FROM
                     dbo.fttable_table2(@dateStart, @dateEnd) R1
                 LEFT JOIN
                     (SELECT Name 
                      FROM dbo.fttable_table2(@dateStart, @dateEnd)
                      GROUP BY Name
                      HAVING COUNT(Name) > 5) AS RG ON R1.Name = RG.Name
         )
         SELECT *
         FROM dbo.fttable_table1 RD 
         JOIN List RL ON RD.Id = RL.Id

         UNION ALL 

         SELECT *
         FROM dbo.fttable_table1 RD  
         JOIN List RL ON RD.name = RL.Name 
         GROUP BY RD.Name

Ошибки в синтаксисе

Сообщение. В каждом представлении имена столбцов или функций должны быть уникальными.Имя столбца 'Id' указывается несколько раз в представлении или функции dbo.listNameId

1 Ответ

1 голос
/ 24 мая 2019

Совет в комментариях хорош: укажите имена столбцов вместо *.

У вас также есть GROUP BY, которая не имеет смысла, поэтому я пытаюсь угадать, что вы хотели:

CREATE FUNCTION dbo.ftliste_NameId
    (@dateStart DATETIME, 
     @dateEnd DATETIME)
RETURNS TABLE
AS 
RETURN
    WITH List AS 
     (
          SELECT DISTINCT 
              CASE 
                 WHEN RG.Name IS NULL 
                    THEN R1.Id 
                    ELSE NULL 
                 END as Id,
                 RG.name  
             FROM
                 dbo.fttable_table2(@dateStart, @dateEnd) R1
             LEFT JOIN
                 (SELECT Name 
                  FROM dbo.fttable_table2(@dateStart, @dateEnd)
                  GROUP BY Name
                  HAVING COUNT(Name) > 5) AS RG ON R1.Name = RG.Name
     )
     SELECT RD.id, RD.name
     FROM dbo.fttable_table1 RD 
     JOIN List RL ON RD.Id = RL.Id

     UNION

     SELECT MIN(RD.id), RD.name
     FROM dbo.fttable_table1 RD  
     JOIN List RL ON RD.name = RL.Name 
     GROUP BY RD.Name
...