简体   繁体   English

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

[英]Insert values into temp Table with Partition By

If have a temporary table declared as following: 如果有一个临时表声明如下:

CREATE TABLE #tempKleerkast(
id INT IDENTITY NOT NULL PRIMARY KEY,
IDKleerkastPersoon int,
ID_Persoon int,
rk int
)

Now i wish to fill up the table with the values from an actual table where i want to get the latest (Not Max) record for each person. 现在我希望用实际表中的值填充表格,我希望获得每个人的最新 (非最大)记录。 Therefor i'm using the following query: 因此我使用以下查询:

      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

The problem is where is when i wish to use insert into as following: 问题是我何时希望使用insert into如下:

      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

I get the following error: Invalid column name 'rk'. 我收到以下错误: 列名称'rk'无效。 Any idea why he doesn't recognise the column rk? 知道为什么他不承认列rk?

Note: The column rk is needed further on in the stored procedure. 注意:存储过程中需要进一步使用列rk。 So i can't exclude it. 所以我不能排除它。

No, the problem comes before you write the INSERT . 不,问题出现在你编写INSERT之前。 Try running just the plain SELECT and you'll see exactly the same error. 尝试只运行普通的SELECT ,你会看到完全相同的错误。 Logically , WHERE runs before SELECT so you can't refer to aliases introduced by the latter in the former. 从逻辑上讲WHERESELECT之前运行,因此您无法在前者中引用后者引入的别名。

This should work: 这应该工作:

  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

(I also removed the DISTINCT since one of the columns listed was also a column listed in the PARTITION BY clause and we're only selecting one row from each partition) (我还删除了DISTINCT因为列出的列之一也是PARTITION BY子句中列出的列,我们只从每个分区中选择一行)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM