Comment puis-je écrire une instruction de sélection SQL pour inclure une recherche à partir d'une autre table?

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

  •  03-07-2019
  •  | 
  •  

Question

Je copie des données d'une base de données à une autre et les masse pendant que je les utilise. Les deux bases de données ont des tables appelées clients et travaux.

Cependant, dans la base de données " Alpha " la table Jobs n'a pas de relation avec la table Clients, où la base de données " Epsilon " Est-ce que. La table des tâches d'Alpha contient simplement le nom du client dans une colonne nvarchar.

J'ai besoin d'une instruction select pour rechercher l'ID du client dans la table Client par son nom pendant que je l'insère dans la table des tâches d'Epsilon.

Mon instruction SQL non terminée ressemble à ceci:

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

Comment puis-je modifier cela pour que le ???? contient le ClientId de la table Clients dans Epsilon? Je sais que je dois rechercher les données à l'aide de la colonne Nom dans Jobs, mais je ne peux pas en comprendre la syntaxe.

Était-ce utile?

La solution

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

Ceci est une jointure plutôt optimiste, mais même si elle doit être modifiée, cela devrait vous donner une idée générale.

Autres conseils

Vous avez besoin d’une jointure. Les jointures, contrairement à ce que tout le monde pense à leurs débuts, n'exigent pas de relations définies dans le schéma de la base de données. Ils exigent simplement que les deux colonnes que vous comparez aient le même type ( modifier voir les commentaires).

La question est de savoir quelle jointure souhaitez-vous? Dans la mesure où aucune relation n'est définie, il peut y avoir des clients avec des travaux et des clients qui n'en ont pas, et des travaux avec des clients et des travaux qui n'en ont pas.

Je suppose que vous voulez que tous les travaux existants existent et qu'un clientId corresponde à la table CLIENTS dans le clientId et que cette relation n'existe pas pour laisser le clientId nul. Nous pouvons le faire avec un JOINDRE GAUCHE. Jobs LEFT JOIN Les clients apporteront tous les enregistrements sur la gauche, même lorsque la relation définie avec les clients de droite n'existe pas. Nous pourrions inverser les deux et faire une bonne jointure, mais ce n'est pas ce que les gens font habituellement. Je vous laisse le soin de lire d'autres types de jointures et leur fonctionnement.

Ainsi, votre instruction select ressemblerait à:

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 n'est pas du même type de données que c.ClientName, vous pouvez modifier le schéma avant d'exécuter la requête pour les aligner.

  

insérer dans Epsilon.dbo.Jobs   (ClientId, Nom, Emplacement,   Date créée)       sélectionnez c.ClientId, Nom, Emplacement, DateCreated à partir d'Alpha.dbo.Jobs en tant que j   jointure interne Epsilon.dbo.Clients en tant que c On   (j.ClientId = c.ClientId)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top