2017-07-20 2 views
0
Join

Ich habe zwei Tabellen:SQL Insert Server links

TABLE1      TABLE2 

COLUMN1 COLUMN2    COLUMN1 COLUMN2 
---------------    --------------- 
John  56      45  A 
Bob  45      45  B 
Eva  68      68  C 
Alex  56      47  D 
Android 48      45  L 
Mum  68      68  C 
…   …      56  Q 
            …  ... 

Und ich brauche Spalte einer Tabelle hinzufügen, mit der Tat habe ich in neue Spaltenwert aus anderen Tabelle einfügen wird mit der Funktion

COLUMN1 COLUMN2 COLUMN3 
----------------------- 
John  56  Q 
Bob  45  B 
Bob  45  A 
Bob  45  L 
Alex  56  Q 
Eva  68  C 
Android 48  NULL   
Mum  68  C 
…   …  …  


ALTER TABLE [dbo].[Table1] 
ADD Column3 NVARCHAR(255); 

INSERT INTO [dbo].[Table1] (column3) 
    SELECT table2.column2 
    FROM [dbo].[Table2] 
    LEFT JOIN [dbo].[table1] ON table1.column2 = table2.column1 

beitreten Aber ich bekomme

COLUMN1 COLUMN2 COLUMN3 
------------------------ 
John  56  
Bob  45  
Eva  68  
NULL  NULL  A 
NULL  NULL  D 
NULL  NULL  C 
…   …  … 

Können Sie mir helfen, meinen Einsatz zu beheben?

+1

Mögliches Duplikat [MS SQL Insert in ausgewählten verbinden] (https://stackoverflow.com/questions/45207656/ms-sql-insert-into-select-join) – Jens

+0

Warum 'John 56 A' Für' John Spalte2 ist 56 und für 56 ist Spalte 2 Q! – Jens

+3

Scheint mir, als ob Sie ein Update benötigen, kein Insert ... –

Antwort

1

mir scheint, wie Sie ein Update benötigen, nicht einen Einsatz ... Versuchen Sie stattdessen:

UPDATE t1 
SET column3 = t2.column2 
FROM dbo.Table2 t2 
LEFT JOIN dbo.Table1 t1 ON t1.column2 = t2.column1 
+0

I denke, es sollte richtig sein beitreten in Ihrer Abfrage oder die Reihenfolge der Tabelle sollte geändert werden –

+0

ja ist nicht arbeiten richtig .. – Luka

+0

@AnkitBajpai Ich nahm die Join aus dem Code in der Frage, vielleicht sind Sie richtig, obwohl. –

2

Ich sehe nicht, was left join damit zu tun hat:

UPDATE t1 
    SET column3 = t2.column2 
    FROM [dbo].[Table1] t1 JOIN 
     [dbo].[Table2] t2 
     ON t1.column2 = t2.column1; 

Die Werte, die nicht in Table2 gefunden werden, werden auf NULL gesetzt.

EDIT:

Halten auf. Sie fügen Zeilen sowie Werte in Spalten ein. Sie scheinen zu wollen, um diese Abfrage zu erreichen:

SELECT t1.column1, t1.column2, t2.column3 
FROM [dbo].[Table1] t1 LEFT JOIN 
    [dbo].[Table2] t2 
    ON t1.column2 = t2.column1; 

Meine Empfehlung wäre, diese in eine neue Tabelle zu setzen, nicht Table1:

SELECT t1.column1, t1.column2, t2.column3 
INTO [dbo].[Table3] 
FROM [dbo].[Table1] t1 LEFT JOIN 
    [dbo].[Table2] t2 
    ON t1.column2 = t2.column1; 

Wenn Sie die Daten wirklich in Table1 ersetzen möchten, dann verwenden, um eine Zwischentabelle:

SELECT t1.column1, t1.column2, t2.column3 
INTO #temp 
FROM [dbo].[Table1] t1 LEFT JOIN 
    [dbo].[Table2] t2 
    ON t1.column2 = t2.column1; 

TRUNCATE TABLE dbo.Table1; 

INSERT INTO dbo.Table1 (column1, column2, column3) 
    SELECT column1, column2, column3 
    FROM #temp; 
+0

Am längsten Anfragen sind meiner Meinung nach die besten, vergessen Sie direkt den ersten zu ändern Wenn Sie mehrere Tabellen für den gleichen Schlüssel haben, werden Sie auf jeden Fall Probleme haben, wenn mehrere Werte für den gleichen Schlüssel vorhanden sind. – Hybris95

+0

@GordonLinoff, Welcher signifikante e Was werden die Zwischentabellen in diesem speziellen Szenario haben? –

+0

@AnkitBajpai. . . Ich habe keine Ahnung, was Sie fragen, außer zu sagen, dass die temporäre Tabelle die Ergebnismenge speichert. Aber wenn du eine Frage hast, solltest du sie vielleicht als Frage stellen. –