【发布时间】:2014-07-09 16:20:19
【问题描述】:
前几天我从一个眼睛没有我那么昏暗的人那里得到了善意,我想我会再试一次。提前感谢您的帮助。
我有一个名为 Contacts 的 SQL Server (2012) 表。该表有四列我目前关心。该表共有 71,454 行。表中有两种类型的记录;公司和员工。两者都使用相同的列,命名为 (Client ID),作为它们的主键。公司名称的存在是公司和员工数据之间的区别。员工没有关联的公司名称。有 29,021 家公司离职 42,433 名员工。
可能有 0-n 名员工与任何一家公司相关联。我正在尝试创建能够反映公司和客户之间关系的输出(如果有的话)。我想使用公司 ID(客户 ID 列)作为我的锚数据集。
不确定我的定义是否正确,但我的想法是根据给定的公司名称创建已知公司的 CTE。然后,使用剩余的客户端 ID,但使用 EXCEPT 子句将已经检索到的客户端 ID 从结果集中过滤掉。
这里是我目前拥有的代码;
;
WITH cte ( BaseID, Client_id, Company_name,
First_name, Last_name, [level] )
AS ( SELECT Client_id AS BaseID ,
Client_id ,
Company_name ,
First_name ,
Last_name ,
1
FROM dbo.Conv_client_clean
WHERE ( COMPANY_NAME IS NOT NULL
OR COMPANY_NAME != ''
)
UNION ALL
SELECT c.BaseID ,
children.Client_id ,
children.Company_name ,
children.First_name ,
children.Last_name ,
cte.[level] + 1
FROM dbo.Conv_client_clean children
INNER JOIN cte c ON c.Client_id = children.CLIENT_ID
EXCEPT
SELECT children.Client_id
FROM cte
)
SELECT BaseID ,
Client_id ,
Company_name ,
first_name ,
Last_name ,
[Level]
FROM cte
OPTION ( MAXRECURSION 0 );
在这种情况下,我收到以下错误;
消息 252,第 16 级,状态 1,第 3 行 递归公用表表达式“cte”不包含顶级 UNION ALL 运算符。
有什么建议吗?
谢谢!
【问题讨论】:
-
您引用了
cte.[level]但没有创建[level] 别名,不确定EXCEPT在递归cte 的上下文中如何工作,这可能有问题。 -
山羊公司 - 感谢您的回复。我曾想过,也许是错误的,在'[level]'的顶级声明中添加[level](对不起,如果有错误的短语-我是新来的:))我实际上是在创建名称(或如您所说,别名)。在第一个 SELECT 中添加“AS [level]”会产生相同的结果。
-
您的 where 子句中有一个 nonSARGable 谓词。 WHERE( COMPANY_NAME IS NOT NULL OR COMPANY_NAME != '' ) 您可以通过将其更改为 WHERE COMPANY_NAME > '' 来简化(和 SARGable)
-
肖恩,谢谢你的建议。在这种情况下,我对优化并不感兴趣,但我会实施您的建议。
-
当你删除你的
EXCEPT子句时它会执行吗?
标签: sql recursion common-table-expression