从多个表创建一个VIEW,每个表都有不同的列数

时间:2012-12-28 14:52:05

标签: asp.net sql sql-server sql-server-2008

我想将多个表合并为一个VIEW 我的理解是,如果列数不同,我们就无法使用UNION 我该如何解决这个问题?

我有以下三个TABLES

1. 表名称 - 相册

enter image description here

2. 表名 - AlbumPictures

enter image description here

3. 表名称 - 故事

enter image description here

我希望有3个表如下:(我可以使用INNER JOINS做这个部分 - 如果我错了,请帮我解决)

For Stories: StoryID,AlbumID,StoryTitle,AlbumCover,Votes

对于相册: AlbumID,AlbumName,AlbumCover,Votes

对于图片: AlbumPictureID,投票

我想将从上述查询中检索到的所有行合并为一个VIEW并对其进行随机播放。由于上面每个结果集中的列数不同,我可以将它们合并为一个VIEW吗?

6 个答案:

答案 0 :(得分:7)

因此,在您的UNION sql中,要么从sql中删除多余的列,要么将具有常量默认值的额外列添加到具有较少列的表的sql中。

根据您的示例输出,添加额外的常量值可能如下所示......

Select StoryID id, AlbumID, 
    StoryTitle name, AlbumCover, Votes
From Stories
 UNION
Select AlbumID id, AlbumID, 
     AlbumName name, AlbumCover, Votes
From Albums
   UNION
Select AlbumPictureID id, null AlbumId, 
     null AlbumCover, Votes
From pictures
Order By id, Votes, name

但这让我想问为什么???

编辑:要进行排序,只需使用输出列名称添加订单,如上所示....

答案 1 :(得分:2)

为了使用UNIONUNION ALL运算符,每个查询返回的列的列数和数据类型必须相同。

您可以使用的一个技巧是为某些查询中“缺失”的列返回NULL值。

为了提高性能,如果不需要删除重复项,建议您使用UNION ALL运算符代替UNION运算符。

每当我需要做这样的事情时,我通常会在每个查询中包含一个文字,作为该行来自哪个查询的标识符。

e.g。

SELECT 'a'     AS source
     , a.id    AS id
     , a.name  AS name 
  FROM table_a a
 UNION ALL
SELECT 'b'     AS source
     , b.id    AS id
     , NULL    AS name
  FROM table_b b
 ORDER BY 1,2 

答案 2 :(得分:1)

你可以这样做。 All three tables are given similar columns with null values TableName column is to identify the table which brings the data

编辑: 我不得不说,这不是正确的做法。我想向您展示如何联合表格,但我认为现在根据您的评论进行编辑时会变得很难看。

--Note: Vote is on all three table, I have selected from Stories
select s.storyId, a.albumId, s.storyTitle, null albumName, 
       ap.albumCover, s.votes , null albumPictureId, 'stories-albums-albumPics' tableName
from Stories s join Albums a on s.albumId = a.albumId 
               join AlbumPictures ap on a.albumid = ap.albumId

UNION ALL 
select null storyId, a.albumID, null storyTitle, a.albumName,
       ap.albumCover, a.votes, null albumPictureId, 'albums-albumPics' tableName
from Albums a join AlbumPictures ap on a.albumid = ap.albumId

UNION ALL --use required table here as well  
select null storyId, null albumId, null storyTitle, null albumName, 
       null albumCover, votes, albumPictureId, 'pictures' tableName 
from Pictures 

答案 3 :(得分:1)

我想这没什么意义,

Select StoryID+'SID' id, AlbumID, 
    StoryTitle name, AlbumCover, Votes
From Stories
 UNION
Select AlbumID+'AID' id, AlbumID, 
     AlbumName name, AlbumCover, Votes
From Albums
   UNION
Select AlbumPictureID+'APID' id, null AlbumId, 
     null AlbumCover, Votes
From pictures

连接' SID' AID'和' APID'当你看到UI数据时它会有所帮助

答案 4 :(得分:0)

select * from Stories as s
inner join Albums as a on a.AccountID = s.AccountID
inner join Pictures as p on p.AccountID = s.AccountID
只要在所有3个表中都定义了AccountID

将全部返回

要获取所需列的唯一列更改*

答案 5 :(得分:0)

为什么您需要将数据全部放在同一视图中?只需返回3组数据。例如,如果您使用Web浏览器作为前端,则可以执行三个查询并将它们作为一组JSON返回,例如:

{
   Albums: [
      {AlbumID: 1, AlbumName: 'blah', ... },
      {AlbumID: 2, AlbumName: 'gorp', ... } 
   ],
   AlbumPictures: [
      {AlbumID: 1, URL: 'http://fun.jpg'},
      {AlbumID: 1, URL: 'http://fun2.jpg'}
   ],
   Stories [
      {StoryID: 3, StoryTitle: 'Jack & Jill', ... },
      { etc. }
   ]
}

绝对没有编程架构约束,迫使您将所有内容放在一个视图中。