まったく同じ列を含む 4 つのテーブルがあり、4 つすべてのビューを作成して、それらをまとめてクエリできるようにしたいと考えています。
これは可能ですか?
(退屈な理由で、それらを組み合わせることができない/許可されていないため、これは無関係になります!)
同じ列名を持つことに加えて、同じ列に同じデータが含まれていると仮定すると、それらすべてのテーブルの和集合であるビューを作成する必要があります。
次のようなものはうまくいくはずですが、私のSQLは錆びています:
(CREATE VIEW view_name AS
(SELECT * FROM table1
UNION
SELECT * FROM table2
UNION
SELECT * FROM table3));
複数のテーブルに存在する可能性のある一意の行を保持するために、「ユニオンオール」を使用する必要がある場合があることに注意してください。標準ユニオンは重複を削除します。
データが UNION に基づいて返されることを期待しているのか、列を個別に含むビューとして返されることを期待しているのか、クエリから判断するのは困難です。これは明らかに効果があります。
次のサンプルを検討してください。
TableA
ID Name RelatedID
1 John 2
2 Paul 1
TableB
ID Name RelatedID
1 Ringo 1
2 George 1
TableC
ID Name RelatedID
1 Bob 1
TableD
ID Name RelatedID
1 Kate NULL
次に、これに対して次のクエリを実行します。
SELECT ID、名前 FROM TableA UNION ALL SELECT ID、名前 FROM TableB UNION ALL SELECT ID、名前 FROM TableC UNION ALL SELECT ID、名前 FROM TableD
これにより、次の出力が得られます。
1 John
2 Paul
1 Ringo
2 George
1 Bob
1 Kate
これはあなたが求めているものですか?その場合は、UNION クエリを使用します。
ここで、目的の効果が関連データの個別のビューを持つことである場合は、次のようなことを行う必要がある場合があります。
SELECT A.ID MasterID, A.Name MasterName,
B.ID BandID, B.Name BandName,
C.ID BlackadderID, C.Name BlackadderName
D.ID BlackadderRealID, D.Name BlackadderRealName
FROM
TableA A
INNER JOIN
TableB B
ON
A.RelatedID = B.ID
INNER JOIN
TableC C
ON
B.RelatedID = C.ID
INNER JOIN
TableD D
ON
C.RelatedID = D.ID
これにより、次のデータ ビューが表示されます。
MasterID MasterName BandID BandName BlackAdderID BlackAdderName BlackadderRealID BlackadderRealName
1 John 2 George 1 Bob 1 Kate
2 Paul 1 Ringo 1 Bob 1 Kate
ユニオンを使用します。 ここに説明があります
ユニオンステートメントを使用する
select * from table1
union
select * from table2
union
select * from table3
それらを結合すればできます(各レコードがどのテーブルから来たかについてのインジケータを含めることをお勧めします):
select table1.column1, 1 as TableNumber
from table1
union
select table2.column1, 2 as TableNumber
from table2
.. etc ..
重複する行を特に除外したい場合を除き、UNION ではなく UNION ALL を使用します。UNION は単独で実行に時間がかかり (重複を見つけるための並べ替えのため)、重複する行を削除します。