2008-12-09 6 views
9

J'ai quatre tables contenant exactement les mêmes colonnes, et je veux créer une vue sur les quatre colonnes afin que je puisse les interroger ensemble.Vue sur plusieurs tables contenant les mêmes colonnes

Est-ce possible?

(pour des raisons fastidieuses je ne peux pas/ne suis pas autorisé à les combiner, ce qui en ferait hors de propos!)

+0

Quel serveur de base de données utilisez-vous? – ysth

+0

Je ne suis pas sûr de votre configuration exacte, mais si vous avez 4 tables en double que vous voulez interroger avec une union, une seule table avec une colonne de type pourrait avoir plus de sens. Sauf si le système existe déjà ou s'il existe d'autres facteurs. –

Répondre

15

En supposant que, en plus d'avoir les mêmes noms de colonnes, les colonnes du même contiennent les mêmes données, vous souhaitez créer une vue qui est l'union de tous les les tables.

Quelque chose comme ce qui suit devrait fonctionner, mais mon SQL est rouillé:

(CREATE VIEW view_name AS 
(SELECT * FROM table1 
UNION 
SELECT * FROM table2 
UNION 
SELECT * FROM table3)); 
+0

UNION est utilisé pour combiner le résultat de plusieurs instructions SELECT en un seul jeu de résultats. –

2

L'instruction syndicale

select * from table1 
union 
select * from table2 
union 
select * from table3 
2

Vous pouvez si vous le syndicat les (je suggère notamment un indicateur à quelle table chaque enregistrement provenait):

select table1.column1, 1 as TableNumber 
from  table1 

union 

select table2.column1, 2 as TableNumber 
from  table2 

.. etc .. 
12

Il peut être utile de noter que vous devrez peut-être utiliser "union all" pour conserver les lignes uniques qui peuvent exister dans plusieurs des tables. Une union standard supprimera les doublons.

+0

Merci - essayait de voir pourquoi certaines des lignes étaient en train d'être omises. C'est un bon point. –

2

Plutôt que UNION, utilisez UNION ALL, sauf si vous souhaitez spécifiquement exclure les lignes en double. UNION seul prend plus de temps à s'exécuter (en raison du type de recherche de dupes) et supprime les lignes en double.

8

Il est difficile de dire à partir de votre requête si vous attendez que les données soient renvoyées en fonction d'UNION, ou en tant que vue contenant les colonnes de façon discrète. Cela a évidemment un effet.

Prenons l'exemple suivant:

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 

Maintenant, exécutez la requête suivante sur ceci:

ID SELECT, Nom DE TableA UNION ALL ID SELECT, Nom DE TableB UNION ALL SELECT ID, Nom FROM TableC UNION ALL SELECT ID, Nom FROM TableD

Ce résultat s dans la sortie suivante:

1 John 
2 Paul 
1 Ringo 
2 George 
1 Bob 
1 Kate 

Est-ce ce que vous cherchez? Si c'est le cas, vous utilisez une requête UNION.

Maintenant, si l'effet que vous êtes après est d'avoir une vue discrète des données connexes, vous devrez peut-être faire quelque chose comme ceci:

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 

Cela se traduira par la vue suivante des données:

MasterID MasterName BandID BandName BlackAdderID BlackAdderName BlackadderRealID BlackadderRealName 
1   John  2  George 1   Bob    1     Kate 
2   Paul  1  Ringo 1   Bob    1     Kate 
Questions connexes