如何从视图中将值插入 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_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
但无法更新 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
语法编写起来相对容易,并且只需使用过滤聚合(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
我有一个视图,我必须在 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_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
但无法更新 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
语法编写起来相对容易,并且只需使用过滤聚合(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