如何从视图中向表中插入值
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_Year
s 插入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
但无法更新表中的任何行。那么在这种情况下我应该使用INSERT
或UPDATE
并且可以使用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
语法相对容易编写,只需使用过滤聚合(MAX
和CASE
内部)。
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.以上是关于如何从视图中向表中插入值的主要内容,如果未能解决你的问题,请参考以下文章