0

複数のテーブルを 1 つに結合したいVIEW
私の理解では、列の数が異なる場合は使用できませんUNION
これを解決するにはどうすればよいですか?

私は次の3つを持っていますTABLES:

1.テーブル名 - アルバム

ここに画像の説明を入力

2.テーブル名-AlbumPictures

ここに画像の説明を入力

3.テーブル名 - ストーリー

ここに画像の説明を入力

次のように3つのテーブルが必要です:(INNER JOINSを使用してこの部分を実行できます-間違っている場合は親切に修正してください)

ストーリーの場合: StoryID、AlbumID、StoryTitle、AlbumCover、Votes

アルバムの場合: AlbumID,AlbumName,AlbumCover,Votes

写真の場合: AlbumPictureID,Votes

上記のクエリから取得したすべての行を 1 つにマージしてVIEWシャッフルしたいと考えています。上記の各結果セットで列数が異なるため、それらを 1 つに結合でき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

UNIONor演算子を使用するにUNION ALLは、各クエリによって返される列の数と列のデータ型が同じである必要があります。

使用できるトリックの1つは、一部のクエリから「欠落している」列に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

いったいなぜ、データをすべて同じビューに表示する必要があるのでしょうか? 3 セットのデータを返すだけです。たとえば、フロント エンドとして Web ブラウザーを使用している場合、3 つのクエリを実行して、それらを JSON の 1 つのセットとして返すことができます。次に例を示します。

{
   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. }
   ]
}

すべてを 1 つのビューにまとめる必要があるプログラミング アーキテクチャ上の制約はまったくありません。

于 2012-12-30T02:18:25.423 に答える
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 に答える