0

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

我有以下三个TABLES

1.表名-相册

在此处输入图像描述

2.表名-AlbumPictures

在此处输入图像描述

3.表名-Stories

在此处输入图像描述

我想要如下 3 个表:(我可以使用 INNER JOINS 来完成这部分 - 如果我错了,请纠正我)

对于故事: StoryID、AlbumID、StoryTitle、AlbumCover、Votes

对于专辑:专辑ID、专辑名称、专辑封面、投票

图片: AlbumPictureID、Votes

我想将从上述查询中检索到的所有行合并为一个VIEW并将它们打乱。由于上述每个结果集中的列数不同,我可以将它们组合成一个VIEW吗?

4

6 回答 6

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

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

编辑:要排序,只需使用输出列名添加一个顺序,如上所示....

于 2012-12-28T14:54:45.090 回答
2

为了使用UNIONorUNION 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 
于 2012-12-28T15:15:43.537 回答
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 
于 2012-12-28T15:08:39.677 回答
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 数据时它会很有意义

于 2012-12-28T15:09:07.200 回答
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

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

仅获取您想要的列的唯一列更改 *

于 2012-12-28T14:57:02.153 回答
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. }
   ]
}

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

于 2012-12-30T02:18:25.423 回答