【问题标题】:Creating a VIEW from multiple tables each with a different number of columns从具有不同列数的多个表创建视图
【发布时间】:2012-12-13 19:48:19
【问题描述】:

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

我有以下三个TABLES

1.表名-专辑

2.表名-相册图片

3.表名-故事

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

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

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

图片:专辑图片ID、投票数

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

【问题讨论】:

  • 您希望视图中有哪些列?在 SQL 中,视图和表具有固定的和预定义的列。
  • @GordonLinoff 我在故事、专辑和图片下的问题中提到了它
  • 怎么可能?您想创建三个不同结构的不同表并将它们合并到一个视图中???
  • 不可能在一个视图中带来三个不同的结果集。不确定你的要求。如果您告诉我们您的要求,可能会有另一种方法。
  • 重做你的问题。清楚地解释你想要完成什么。这是我能给你的最好建议。你的问题现在问错了。

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


【解决方案1】:

因此,在您的 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

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

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

【讨论】:

  • 是的,为什么:P。在列中包含故事 ID、专辑 ID 和图片 ID 没有任何意义..
  • 在 UI 中,我正在检索滚动上的数据...所以我需要将所有数据放在同一个视图中。如果我错了,请纠正我...有什么办法可以对视图中的行进行排序。
  • 是的,那么在 UI 中您将如何识别 Story_Id 和专辑 ID??
【解决方案2】:
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

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

【讨论】:

  • 发布代码时,请突出显示它并点击{}代码按钮 - 它保留格式并添加语法突出显示。
  • 我怎么理解...哪一行来自哪个表?
【解决方案3】:

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

编辑: 我不得不说,这不是正确的方法。我想向您展示如何合并表,但我认为现在根据您的 cmets 编辑它时变得很难看。

--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 

【讨论】:

  • 对于第一个 SELECT AlbumCover 来自 AlbumPictures 表。所以,我必须在这里使用 INNER JOIN 吗?它不能为空,因为我需要它。
  • @user1593175 :是的,就是这个想法,我相信你可以根据需要实现。
  • 对不起,我在这里搞糊涂了,你能把查询添加到你的答案中吗?
  • 会是这样吗? SELECT StoryID, AlbumID, StoryTitle, NULL AS albumName, (select url from AlbumPictures where AlbumID=Stories.AlbumID and AlbumCover='True'), Votes, NULL AS PictureId, 'stories' AS tableName FROM dbo.Stories
  • 我不得不说,这不是正确的做法。我想向您展示如何合并表,但我认为现在它越来越难看,原始问题的更多细节。
【解决方案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'、'AID' 和 'APID',当你看到 UI 数据时它会很有意义

【讨论】:

    【解决方案5】:

    为了使用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 
    

    【讨论】:

      【解决方案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. }
         ]
      }
      

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

      【讨论】:

      • 你理解我的问题,我相信你的解决方案是最好的。你能给我一个简单的例子,我怎样才能像你在你的答案中那样创建一个 JSON 对象?我很困惑如何区分 AlbumsAlbumPicturesStories ,我也可以在 JSON 对象中对数据进行排序吗?
      • 您使用什么语言查询数据库?用户有什么样的 GUI?是浏览器吗?我们对您在做什么几乎一无所知,因此帮不上什么忙。
      • 是的,UI 是一个浏览器,我正在使用带有 sql server 的 ASP.NET Web 表单。
      • 所以问题不在于从数据库中选择。它可以使用您的 C#/VB.Net 代码(从中创建 JSON),也可以使用您的 javascript 代码(如果您使用 Ajax)。您需要打开一个新问题。不要显示您的表格布局——这无关紧要。您需要回答的真正问题是如何使用 ASP.Net 将三个记录集发送到客户端。去问那个问题,用你已经尝试过的东西或者至少你到目前为止所拥有的东西,然后在这里给我一个链接。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-30
      • 2020-09-21
      • 1970-01-01
      • 2019-07-14
      相关资源
      最近更新 更多