¿Cómo puedo escribir una declaración de selección SQL para incluir una búsqueda de otra tabla?

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

  •  03-07-2019
  •  | 
  •  

Pregunta

Estoy copiando datos de una base de datos a otra y masajeando los datos mientras estoy en ello. Ambas bases de datos tienen tablas llamadas Clientes y Trabajos.

Sin embargo, en la base de datos " Alpha " La tabla de trabajos no tiene una relación con la tabla de clientes, donde la base de datos " Epsilon " hace. La tabla de trabajos de Alpha solo tiene el nombre de los Clientes en una columna nvarchar.

Necesito una declaración de selección para buscar el ID del cliente en la tabla del cliente por su nombre mientras lo inserto en la tabla de trabajos en Epsilon.

Mi declaración de SQL sin terminar se ve así:

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

¿Cómo puedo modificar esto para que el ???? contiene el ClientId de la tabla Clientes en Epsilon? Sé que debo buscar los datos utilizando la columna Nombre en Trabajos, pero no puedo entender la sintaxis de esto.

¿Fue útil?

Solución

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 es una combinación bastante optimista, pero incluso si necesita ser modificada, debería darte una idea general.

Otros consejos

Lo que necesitas es una unión. Las combinaciones, al contrario de lo que prácticamente todo el mundo piensa al comenzar, no requieren relaciones definidas en el esquema de la base de datos. Solo requieren que las dos columnas que está comparando tengan el mismo tipo ( editar ver comentarios).

La pregunta es qué combinación quieres. Debido a que no hay una relación definida, puede haber clientes que tengan trabajos y clientes que no los tengan, y trabajos que tengan clientes y trabajos que no.

Supongo que desea que existan todos los TRABAJOS, y cuando un ID de cliente coincida con la tabla CLIENTES ingrese el ID de cliente, y donde no exista esa relación para dejar el ID de cliente nulo. Podemos hacer esto con un JOIN IZQUIERDO. Jobs LEFT JOIN Clients traerá todos los registros de la IZQUIERDA, incluso cuando no exista la relación definida con los Clientes de la derecha. Podríamos revertir los dos y hacer una JUNTA CORRECTA, pero eso no es lo que la gente suele hacer. Te lo dejo a usted para leer sobre otros tipos de uniones y cómo funcionan.

Por lo que su declaración de selección se vería así:

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

Si Jobs.ClientName no es el mismo tipo de datos que c.ClientName, puede editar el esquema antes de ejecutar la consulta para alinearlos entre sí.

  

inserte en Epsilon.dbo.Jobs   (ClientId, Nombre, Ubicación,   Fecha de creacion)       seleccione c.ClientId, Name, Location, DateCreated from Alpha.dbo.Jobs as j   Epsilon.dbo.Clients de unión interna como c en   (j.ClientId = c.ClientId)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top