Come posso scrivere un'istruzione di selezione SQL per includere una ricerca da un'altra tabella?

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

  •  03-07-2019
  •  | 
  •  

Domanda

Sto copiando i dati da un database all'altro e massaggiando i dati mentre ci sono. Entrambi i database hanno tabelle chiamate Clienti e Lavori.

Tuttavia, nel database " Alpha " la tabella Lavori non ha una relazione con la tabella Clienti, dove il database "Epsilon" lo fa. La tabella Lavori di Alpha ha solo il nome del cliente in una colonna nvarchar.

Ho bisogno di un'istruzione select per cercare l'ID del cliente nella tabella Client con il loro nome mentre lo inserisco nella tabella Jobs in Epsilon.

La mia istruzione SQL incompiuta è simile alla seguente:

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

Come posso modificarlo in modo che il ???? contiene il ClientId dalla tabella Client in Epsilon? So che devo cercare i dati usando la colonna Nome in Lavori, ma non riesco a capire la sintassi per questo.

È stato utile?

Soluzione

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

Questo è un join piuttosto ottimistico, ma anche se deve essere modificato questo dovrebbe darti l'idea generale.

Altri suggerimenti

Ciò di cui hai bisogno è un join. I join, contrariamente a quanto quasi tutti pensano all'inizio, non richiedono relazioni definite nello schema del database. Richiedono solo che le due colonne che stai confrontando abbiano lo stesso tipo ( modifica vedi commenti).

La domanda è: quale join desideri. Poiché non è stata definita una relazione, potrebbero esserci client che hanno lavori e client che non lo fanno e lavori che hanno client e lavori che non lo fanno.

Suppongo che tu voglia tutti i JOBS esistenti e dove un ClientId corrisponde alla tabella CLIENTS porti ClientId e dove quella relazione non esiste per lasciare il ClientId null. Possiamo farlo con un JOIN SINISTRA. Lavori LEFT JOIN I clienti inseriranno tutti i record nella LEFT, anche se non esiste la relazione definita con i clienti sulla destra. Potremmo invertire i due e fare UN GIUSTO, ma non è quello che fanno di solito le persone. Lascio a te leggere altri tipi di join e come funzionano.

Quindi la tua dichiarazione select dovrebbe apparire come:

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 non è lo stesso tipo di dati di c.ClientName, è possibile modificare lo schema prima di eseguire la query per allinearli.

  

inserisci in Epsilon.dbo.Jobs   (ID client, nome, posizione,   Data di creazione)       selezionare c.ClientId, Nome, Posizione, DataCreato da Alpha.dbo.Jobs come j   join interno Epsilon.dbo.Clients come c On   (j.ClientId = c.ClientId)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top