使用分区依据将值插入临时表

时间:2014-01-16 08:41:21

标签: sql sql-server temp-tables sql-insert row-number

如果临时表声明如下:

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。所以我不能排除它。

1 个答案:

答案 0 :(得分:2)

不,问题出现在你写INSERT之前。尝试只运行普通SELECT,您将看到完全相同的错误。 LogicallyWHERESELECT之前运行,因此您无法在前者中引用后者引入的别名。

这应该有效:

  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子句中列出的列,我们只从每个分区中选择一行)