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