CTE成功能

时间:2019-05-24 10:15:02

标签: sql-server tsql common-table-expression

我想创建必须包含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

语法错误

  

消息:在每个视图中,列或函数的名称必须唯一。在视图或函数dbo.listNameId中多次指定了列名“ Id”

1 个答案:

答案 0 :(得分:1)

注释中的建议很好:指定列名而不是*

您还有一个没有意义的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