Wie kann ich eine SQL-Select-Anweisung schreiben einen Nachschlag aus einer anderen Tabelle enthalten?

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

  •  03-07-2019
  •  | 
  •  

Frage

Ich bin Kopieren von Daten von einer Datenbank zur anderen und Massieren der Daten, während ich es bin. Beide Datenbanken haben Tabellen genannt Clients und Jobs.

Doch in der Datenbank „Alpha“ der Jobs-Tabelle keine Beziehung zu der Client-Tabelle haben, wo Datenbank „Epsilon“ der Fall ist. Jobs Tabelle Alpha nur den Clients Namen in einer nvarchar-Spalte.

Ich brauche eine select-Anweisung die ID des Client in der Client-Tabelle durch ihren Namen nachzuschlagen, während ich es in die Tabelle Aufträge in Epsilon bin eingefügt wird.

Meine unvollendete SQL-Anweisung sieht wie folgt aus:

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

Wie kann ich das ändern, so dass das ???? enthält die ClientId aus der Tabelle Kunden in Epsilon? Ich weiß, ich brauche die Daten zum Nachschlagen des Spalt Namen in Jobs, aber ich kann die Syntax für diese nicht herausgefunden.

War es hilfreich?

Lösung

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

Dies ist ein ziemlich optimistisch beitreten, aber selbst wenn es geändert werden muss sollte dies Ihnen die allgemeine Idee geben.

Andere Tipps

Was Sie brauchen, ist eine Verknüpfung. Schließt sich, im Gegensatz zu dem, was so ziemlich jeder denkt, wenn ausgehend, nicht definierten Beziehungen in dem Schema der Datenbank erfordern. Sie erfordern nur, dass die beiden Spalten Sie vergleichen die gleiche Art haben ( Bearbeiten siehe Kommentar).

Die Frage ist, welche beitreten wollen Sie. Da es nicht eine Beziehung definiert ist, kann es Kunden sein, die Arbeitsplätze und Kunden haben, die dies nicht tun, und Jobs, die Kunden und Arbeitsplätze haben, dass dies nicht tun.

Ich gehe davon aus, dass Sie alle JOBS wollen, die es gibt, und wo ein ClientId der KUNDEN-Tabelle in der ClientId bringen übereinstimmt, und wo diese Beziehung existiert nicht die ClientId null zu verlassen. Wir können dies tun, mit einem LEFT JOIN. Jobs LEFT JOIN-Clients in allen Datensätzen auf der LINKEN bringen, auch wenn die Beziehung mit Kunden auf der rechten Seite definiert ist nicht vorhanden. Wir könnten die beiden umkehren und tun eine RIGHT JOIN, aber das ist nicht das, was die Menschen in der Regel tun. Ich werde es Ihnen überlassen auf andere Arten zu lesen, der Joins und wie sie funktionieren.

So Ihre select-Anweisung würde wie folgt aussehen:

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

Wenn Jobs.ClientName nicht die gleichen Datentyp wie c.ClientName ist, können Sie das Schema vor dem Ausführen der Abfrage bearbeiten sie miteinander in Einklang zu bringen.

  

Einfügen in Epsilon.dbo.Jobs   (ClientId, Name, Sitz,   Datum erstellt)       wählen c.ClientId, Name, Sitz, Datecreated von Alpha.dbo.Jobs als j   Exklusionsverknüpfung Epsilon.dbo.Clients als c On   (J.ClientId = c.ClientId)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top