我想将多个表合并为一个VIEW
我的理解是,如果列数不同,我们就无法使用UNION
我该如何解决这个问题?
我有以下三个TABLES
:
1. 表名称 - 相册
2. 表名 - AlbumPictures
3. 表名称 - 故事
我希望有3个表如下:(我可以使用INNER JOINS做这个部分 - 如果我错了,请帮我解决)
For Stories: StoryID,AlbumID,StoryTitle,AlbumCover,Votes
对于相册: AlbumID,AlbumName,AlbumCover,Votes
对于图片: AlbumPictureID,投票
我想将从上述查询中检索到的所有行合并为一个VIEW
并对其进行随机播放。由于上面每个结果集中的列数不同,我可以将它们合并为一个VIEW
吗?
答案 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)
为了使用UNION
或UNION 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. }
]
}
绝对没有编程架构约束,迫使您将所有内容放在一个视图中。