Como posso escrever uma instrução SELECT SQL para incluir uma pesquisa de outra tabela?

StackOverflow https://stackoverflow.com/questions/817283

  •  03-07-2019
  •  | 
  •  

Pergunta

Eu estou copiando dados de um banco para outro e massageando os dados enquanto eu estou nele. Ambos os bancos de dados têm tabelas chamados de clientes e Jobs.

No entanto, no banco de dados "Alpha" tabela de Jobs não tem um relacionamento com a tabela de clientes, onde banco de dados "Epsilon" faz. mesa de Jobs da Alpha só tem o nome de clientes em uma coluna nvarchar.

Eu preciso de uma instrução SELECT para procurar ID do cliente na tabela de cliente pelo seu nome, enquanto eu estou inserindo-o na tabela de Jobs em Epsilon.

As minhas inacabadas instrução SQL esta aparência:

insert into Epsilon.dbo.Jobs (ClientId, Name, Location, DateCreated)
    select ????, Name, Location, DateCreated from Alpha.dbo.Jobs

Como posso modificar isso para que a ???? contém o ClientId da tabela de clientes em Epsilon? Eu sei que preciso para procurar os dados usando a coluna Nome de Jobs, mas eu não consigo descobrir a sintaxe para isso.

Foi útil?

Solução

insert into Epsilon.dbo.Jobs (ClientId, Name, Location, DateCreated)
    select c.ClientID, a.Name, a.Location, a.DateCreated from Alpha.dbo.Jobs a
    join Epsilon.dbo.Client c on c.Name = a.ClientName

Esta é uma junção muito otimista, mas mesmo se ele precisa ser modificada isso deve dar-lhe a idéia geral.

Outras dicas

O que você precisa é uma junção. Junta-se, ao contrário do que praticamente todo mundo pensa quando se inicia, não necessitam de relacionamentos definidos no esquema do banco de dados. Eles requerem apenas que as duas colunas que você está comparando tem o mesmo tipo ( editar ver comentários).

A questão é que se juntam quer. Porque não há uma relação definida, pode haver clientes que têm empregos e clientes que não, e trabalhos que têm clientes e empregos que não.

Eu estou supondo que você quer todos os trabalhos que existem, e onde um ClientId corresponde a tabela CLIENTES trazer o ClientId, e onde essa relação não existe para deixar o nulo ClientId. Podemos fazer isso com um LEFT JOIN. Jobs LEFT JOIN clientes vai trazer todos os registros do lado esquerdo, mesmo quando a relação definida com clientes sobre o direito não existe. Poderíamos reverter os dois e fazer um RIGHT JOIN, mas não é isso que as pessoas costumam fazer. Vou deixar para você para ler sobre outros tipos de junções e como eles funcionam.

Assim sua instrução select seria parecido com:

select ClientId, Name, Location, DateCreated 
from Alpha.dbo.Jobs as J LEFT JOIN 
    Alpha.dbo.Clients as C ON j.ClientName = c.ClientName

Se Jobs.ClientName não é o mesmo tipo de dados como c.ClientName, você pode editar o esquema antes de executar a consulta para alinhá-las com os outros.

INSERT INTO Epsilon.dbo.Jobs (ClientId, Nome, Localização, Data Criada) selecionar c.ClientId, Nome, Localização, DateCreated de Alpha.dbo.Jobs como j junção interna Epsilon.dbo.Clients como c On (J.ClientId = c.ClientId)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top