2009-05-03 8 views
0

Je suis en train de copier des données d'une base de données à une autre et de masser les données pendant que j'y suis. Les deux bases de données ont des tables appelées Clients et Jobs.Comment puis-je écrire une instruction SQL select pour inclure une recherche d'une autre table?

Cependant, dans la base de données "Alpha", la table des tâches n'a pas de relation avec la table Clients, où la base de données "Epsilon" se trouve. La table Jobs d'Alpha a juste le nom des clients 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 Jobs dans Epsilon.

Ma déclaration inachevée SQL ressemble à ceci:

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

Comment puis-je modifier cette façon 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 comprendre la syntaxe pour cela.

+0

Évidemment, vous pouvez choisir la réponse qui correspond le mieux à la question, mais la réponse sélectionnée a été affichée 7 minutes après que j'ai posté le mien. –

Répondre

2
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 assez optimiste, mais même si elle doit être modifié cela devrait vous donner l'idée générale.

+0

+1, mais Will a donné fondamentalement la même réponse quelques minutes avant vous donc il a obtenu la coche. Merci pour la réponse. –

+0

A posté sa réponse 7 minutes après que j'ai posté le mien. –

+0

Doh!Le cerveau stupide ne fonctionne toujours pas. Mauvais cerveau, mauvais! –

1

insert dans Epsilon.dbo.Jobs (ClientId, nom, emplacement, DateCreated) sélectionner c.ClientId, nom, emplacement, DateCreated de Alpha.dbo.Jobs que j jointure interne Epsilon.dbo. clients comme c Sur (j.ClientId = c.ClientId)

+1

Il n'a pas de ClientID dans Alpha.dbo.Jobs –

+0

Assez proche pour un +1. Sauf pour ce petit glissement, c'était la même chose que les autres réponses. :) –

3

Ce dont vous avez besoin est une jointure. Les jointures, contrairement à ce que tout le monde pense généralement au démarrage, ne nécessitent 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 (éditez voir les commentaires).

La question est quelle jointure voulez-vous. Parce qu'il n'y a pas de relation définie, il peut y avoir des clients qui ont des travaux et des clients qui ne le font pas, et des emplois qui ont des clients et des emplois qui n'en ont pas.

Je suppose que vous voulez tous les emplois qui existent, et où un ClientId correspond à la table CLIENTS apporter dans le ClientId, et où cette relation n'existe pas pour laisser le ClientId nulle. Nous pouvons le faire avec un jointure à gauche. Jobs LEFT JOIN Les clients introduiront tous les enregistrements à GAUCHE, même si la relation définie avec les clients à droite n'existe pas. Nous pourrions inverser les deux et faire une bonne adhésion, mais ce n'est pas ce que les gens font habituellement. Je vais vous laisser le soin de lire d'autres types de jointures et comment elles fonctionnent.

donc votre instruction select ressemblerait à ceci:

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

+2

"Ils exigent simplement que les deux colonnes que vous comparez aient le même type." Pas même ça. Juste qu'il y a un opérateur ou une fonction qui peut prendre au moins une colonne de chaque table et retourner/évaluer à un booléen. – tpdi

+0

+1 vrai date ..... – Will

Questions connexes