如何从视图中将值插入 table

How to insert values in a table from a view

我有一个视图,我必须在 table 中插入值。视图如下:

Author_ID   Research_Area   Category    Paper_Count Paper_Year  Rank
--------------------------------------------------------------------
677         feature         8           1           2005        1
677         image           11          1           2005        2
677         retrieval       12          1           2005        3
677         semantic        19          1           2007        1
677         feature         8           1           2009        1
677         video           5           2           2013        1
1359        image           11          2           2005        1
1359        adversary       1           1           2005        2
1359        archiving       12          1           2005        3
1359        linear          1           3           2006        1
1359        real time       17          3           2006        2
...  
...  

而 Table 为:

id   Author_ID   Category_2005   Category_2006   Category_2007.....Category_2014   Rank
---------------------------------------------------------------------------------------  

我必须插入每个 Author_ID 并且每个 Author_ID 都有三个值 Category 列根据每个 Paper_Year 的排名,一些 Author_ID' s 可能没有某些 Paper_Year 的值,因此必须为没有 Category 值的 Paper_Year 插入 0,而每个 Author_ID 应该只显示 3 次结果 table.

我只试过 Paper_Year2005 为:

UPDATE A
SET A.aid       =   (SELECT vA.Author_ID 
                     FROM Author_Area vA 
                     WHERE vA.Paper_Year = 2005 AND vA.Rank = 1),
A.Category_2005 =   (SELECT vA.Category 
                     FROM Author_Area vA 
                     WHERE vA.Paper_Year = 2005 AND vA.Rank = 1)
FROM Author_Areas A  

但无法更新 table 中的任何行。那么我应该在这种情况下使用 INSERT 还是 UPDATE 并且可以使用 CASE 语句,如果是这样那么如何?

此外,我在结果 table 中的输出应该是这样的:

id   Category_2005   Category_2006   Category_2007 ...   Category_2014   Rank
-----------------------------------------------------------------------------
677  8               0               19                  0               1
677  11              0               0                   0               2
677  12              0               0                   0               3
1359 11              1               0                   1               1
1359 1               17              0                   0               2
1359 12              0               10                  0               3
...
...

我假设您想在 table 中创建新行? 另外,我假设 id 列是主键 IDENTITY 列?

您只是想找到一种转向的方法(actually a language feature)。在这种情况下,不使用 PIVOT 语法编写起来相对容易,并且只需使用过滤聚合(MAXCASE 内部)。

INSERT INTO Author_Areas (
  ID,
  Category_2005,
  Category_2006,
  Category_2007,
  Category_2008,
  Category_2009,
  Category_2010,
  Category_2011,
  Category_2012,
  Category_2013,
  Category_2014,
  Rank
)
SELECT Author_ID,
  MAX(CASE WHEN Paper_Year = 2005 THEN category ELSE 0 END),
  MAX(CASE WHEN Paper_Year = 2006 THEN category ELSE 0 END),
  MAX(CASE WHEN Paper_Year = 2007 THEN category ELSE 0 END),
  MAX(CASE WHEN Paper_Year = 2008 THEN category ELSE 0 END),
  MAX(CASE WHEN Paper_Year = 2009 THEN category ELSE 0 END),
  MAX(CASE WHEN Paper_Year = 2010 THEN category ELSE 0 END),
  MAX(CASE WHEN Paper_Year = 2011 THEN category ELSE 0 END),
  MAX(CASE WHEN Paper_Year = 2012 THEN category ELSE 0 END),
  MAX(CASE WHEN Paper_Year = 2013 THEN category ELSE 0 END),
  MAX(CASE WHEN Paper_Year = 2014 THEN category ELSE 0 END),
  Rank
FROM
  Author_Area
GROUP BY
  Author_ID, Rank