Vista sobre várias tabelas contendo mesmas colunas
Pergunta
Eu tenho quatro tabelas que contêm exatamente as mesmas colunas, e deseja criar uma vista sobre todos os quatro para que eu possa consultá-los juntos.
Isso é possível?
(por razões tediosas eu não posso / não me é permitido combiná-los, o que tornaria este irrelevante!)
Solução
Assumindo que além de ter os mesmos nomes de colunas, colunas do mesmo contêm os mesmos dados, que pretende criar uma visão que é a união de todas essas tabelas.
Algo como o seguinte deve funcionar, mas o meu SQL está enferrujado:
(CREATE VIEW view_name AS
(SELECT * FROM table1
UNION
SELECT * FROM table2
UNION
SELECT * FROM table3));
Outras dicas
Pode ser interessante notar que você pode precisar usar "união all" para preservar linhas únicas que podem existir em mais de uma das mesas. Uma união padrão irá remover duplicatas.
É difícil dizer a partir de sua consulta se você espera que o dado a ser retornado com base em um UNION, ou como uma exibição que contém as colunas discretamente. Isto, obviamente, tem um efeito.
Considere o seguinte exemplo:
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
Agora, execute a seguinte consulta contra esta:
SELECIONAR ID, nome TableA UNION ALL Id, nome TableB UNION ALL Id, nome TableC UNION ALL Id, nome apresentadas
Isto resulta na seguinte saída:
1 John
2 Paul
1 Ringo
2 George
1 Bob
1 Kate
É isso que você está depois? Se assim for, você usa uma consulta UNION.
Agora, se o efeito que você está depois é ter uma visão discreta de dados relacionados, você pode precisar de fazer algo como isto:
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
Isto irá resultar na seguinte vista dos dados:
MasterID MasterName BandID BandName BlackAdderID BlackAdderName BlackadderRealID BlackadderRealName
1 John 2 George 1 Bob 1 Kate
2 Paul 1 Ringo 1 Bob 1 Kate
Use união. Aqui está a explicação
Use a declaração da União
select * from table1
union
select * from table2
union
select * from table3
Você pode se você união deles (eu sugeriria incluindo um indicador de qual tabela de cada registro veio):
select table1.column1, 1 as TableNumber
from table1
union
select table2.column1, 2 as TableNumber
from table2
.. etc ..
Em vez de UNION, uso UNION ALL, a menos que você quer especificamente linhas duplicadas a ser excluído. UNIÃO em sua própria leva mais tempo para executar (por causa do tipo que faz para encontrar dupes), e remove as linhas duplicadas.