如果临时表声明如下:
CREATE TABLE #tempKleerkast(
id INT IDENTITY NOT NULL PRIMARY KEY,
IDKleerkastPersoon int,
ID_Persoon int,
rk int
)
现在我希望用实际表中的值填充表格,我希望为每个人获取最新(非最大)记录。因此我使用以下查询:
SELECT
DISTINCT IDKleerkastPersoon AS Expr1, kk.ID_Persoon,
ROW_NUMBER() OVER (PARTITION BY kk.ID_Persoon
ORDER BY kk.IDKleerkastPersoon DESC) AS rk
FROM KleerkastPerPersoon kk
WHERE kk.ID_Persoon IS NOT NULL AND rk = 1
问题在于我希望如何使用插入:
INSERT INTO #tempKleerkast(IDKleerkastPersoon,ID_Persoon,rk)
SELECT
DISTINCT IDKleerkastPersoon AS Expr1, kk.ID_Persoon,
ROW_NUMBER() OVER (PARTITION BY kk.ID_Persoon
ORDER BY kk.IDKleerkastPersoon DESC) AS rk
FROM KleerkastPerPersoon kk
WHERE kk.ID_Persoon IS NOT NULL AND rk = 1
我收到以下错误:列名称'rk'无效。 知道他为什么不认识专栏吗?
注意:存储过程中需要进一步使用列rk。所以我不能排除它。
答案 0 :(得分:2)
不,问题出现在你写INSERT
之前。尝试只运行普通SELECT
,您将看到完全相同的错误。 Logically,WHERE
在SELECT
之前运行,因此您无法在前者中引用后者引入的别名。
这应该有效:
INSERT INTO #tempKleerkast(IDKleerkastPersoon,ID_Persoon,rk)
SELECT IDKleerkastPersoon, ID_Persoon, rk
FROM (
SELECT
IDKleerkastPersoon, kk.ID_Persoon,
ROW_NUMBER() OVER (PARTITION BY kk.ID_Persoon
ORDER BY kk.IDKleerkastPersoon DESC) AS rk
FROM KleerkastPerPersoon kk
WHERE kk.ID_Persoon IS NOT NULL) t
WHERE rk = 1
(我还删除了DISTINCT
,因为列出的列之一也是PARTITION BY
子句中列出的列,我们只从每个分区中选择一行)