如何从视图中向表中插入值

Posted

技术标签:

【中文标题】如何从视图中向表中插入值【英文标题】:How to insert values in a table from a view 【发布时间】:2015-12-04 06:13:17 【问题描述】:

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

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
...  
...  

表格如下:

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

我必须根据每个Paper_Year 的排名插入每个Author_ID 并且每个Author_ID 具有三个Category 列的值,一些Author_ID 可能没有一些Paper_Year 的值所以必须为没有Category 值的Paper_Years 插入0,而每个Author_ID 应该只在结果表中显示3 次。

我只为Paper_Year 尝试过这个,即2005

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  

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

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

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
...
...

【问题讨论】:

【参考方案1】:

我假设您想在表中创建新行? 另外,我假设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

【讨论】:

你需要描述你想用这些值做什么。您的示例查询只是忽略了它们,所以我的解决方案也是。 我已经更新了我的答案,每个作者每个等级插入一行。 @Jeff--我已经显示了结果表,它应该是什么样子 @Jeff--“当 IDENTITY_INSERT 设置为 OFF 时,无法在表 'Author_Areas' 中插入标识列的显式值。”这是错误,而我的身份规范设置为是 让我们continue this discussion in chat.

以上是关于如何从视图中向表中插入值的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SQLite 中向表中添加变量?

如何在SQL中向表中添加“X”行?

如何在 React Hooks 中向表中添加行而不重复?

T-SQL中向表中插入一条数据,其中类型为Decimal的列对应的插入值为‘2400’可就是不行还报“......

SQL中向表中添加的字符都变成问号了,啥情况?怎么处理?

在 Qt 创建器中向表视图添加仅可读行