从创建多个表的VIEW每一个不同的列数(Creating a VIEW from multiple

2019-11-01 08:32发布

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

我有以下三个TABLES

1。 表名称-相册

2. 表名称,AlbumPictures

3. 表名称,故事

我想有3个表如下:(我可以使用内部JOINS-亲切纠正我,如果我错了,这样做的部分)

对于故事:StoryID,ALBUMID,StoryTitle,专辑封面,投票

对于专辑:ALBUMID,ALBUMNAME,专辑封面,投票

对于图片:AlbumPictureID,投票

我想合并从上面的查询检索到一个全行VIEW和洗牌它们。 由于列数在每个结果的不同上述套我只能对它们组合成一个VIEW

Answer 1:

你可以做这样的事情。 All three tables are given similar columns with null valuesTableName 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 


Answer 2:

因此,在你的SQL UNION,无论是从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

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

编辑:排序,仅仅通过使用输出列名添加的顺序,如上所示....



Answer 3:

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

你可以使用一个技巧是对于从一些疑问的“失踪”的列返回NULL值。

出于性能考虑,我建议你使用UNION ALL操作到位的UNION操作,如果删除重复不是必需的。

每当我需要做这样的事情,我一般包括在每个查询文字,作为标识符的查询行是从哪里来的。

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 


Answer 4:

我想这没有什么意义,

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”,“援助”和“APID”,它将使一些感觉,当你看到UI数据



Answer 5:

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

将返回所有,只要AccountID被定义在所有3个表

要只获得唯一的列改变*为您服务的愿望列



Answer 6:

为什么地球上,你将需要的数据是所有在同一视图? 只是返回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. }
   ]
}

绝对没有任何编程架构约束迫使你在一个单一的视图来把一切融合在一起。



文章来源: Creating a VIEW from multiple tables each with a different number of columns