我正在尝试提取一个连接3个表的数据集
- 员工E
- 缺席类型AT
- 缺勤余额AB
在数据集中,我需要AB.BalanceTime
中每个AB.EmployeeUID
到AB.AbsenceTypesUID
的最新记录。
数据集与我需要的输出是正确的,当我查询CTE时它失败了。
;WITH cte AS
(
SELECT TOP (1000)
AB.[UID],
AB.BalanceTime,
AB.AbsenceTypesUID,
AB.Mins,
E.FullName,
E.FirstName, E.LastName,
AB.EmployeeUID,
AT.LongName,
ROW_NUMBER() OVER(PARTITION BY AB.[UID], AB.EmployeeUID ORDER BY AB.BalanceTime DESC) AS RUN
FROM
[RiteqDB].[dbo].[AbsenceBalance] AB
LEFT JOIN
[RiteqDB].[dbo].Employee E ON AB.EmployeeUID = E.UID
LEFT JOIN
[RiteqDB].[dbo].AbsenceTypes AT ON AB.AbsenceTypesUID = AT.UID
)
SELECT *
FROM cte
WHERE RUN = 1 AND E.FullName = 'john citizen'
错误
Msg4104,级别16,状态1,第45行
多部分标识符"E.全名";无法绑定。
我已经在谷歌上搜索了这个问题&据我所知,联接的表不与CTE交互,这就是它在以下条件下失败的原因。
AND E.FullName = 'john citizen'
如何更改脚本以便查询表?
表别名E
仅在内部中定义,而不在外部查询中定义。在该范围中,只有一个(派生的(表,称为cte
,它具有CTE返回的所有列名。
换句话说,你可以做:
with cte as (...)
select *
from cte
where run = 1 and fullname = 'john citizen'
如果你真的想使用别名,那么给CTE取别名,然后:
with cte as (...)
select c.*
from cte c
where c.run = 1 and c.fullname = 'john citizen'