2 Tabellen zusammenführen

marsi

Benutzer
Beiträge
15
Hallo liebe Experten,

ich möchte 2 Tabellen vergleichen und die Differnz abgleichen.
Tabelle 1= Abgaben_1 --> Produktionstabelle
Tabelle_2 = Abgabe_2 --> Backup Tabelle

Wenn in Tabelle 1 (Abgaben_1 ) Zeilen entfernt worden sind, sollen diese wieder mit der Backup-Tabelle (Abgabe_2) ausgefüllt werden. Die Tabelleinhalte sind identisch.
Hier soll die 1. Spalte mit Namen abgegleichen werden

Insert into [Entwicklung].[dbo].[Abgaben_2]
select * from [Entwicklung].[dbo].[Abgaben_1] AS t1, [Entwicklung].[dbo].[Abgaben_2] AS t2
Where t1.STUDENT Like t2.STUDENT;

Leider taucht diese Fehlermeldung auf: Column name or number of supplied values does not match table definition

Was mache ich hier falsch ?

Oder gibt es eine bessere Möglichkeit um 2 identische Tabellen zu vergleichen und die fehlenden Zeilen wieder aufzufüllen ?


Danke und Gruß, marsi
 
Zuletzt bearbeitet:
Werbung:
Ein "Select *" gibt Dir alle Spalten aus allen Quelltabellen aus, also in Deinem Fall alles doppelt.
Wenn Du das Insert erstmal weglässt, würdest Du tatsächlich sehen, was selektiert wird. Dann würdest Du feststellen, vielzuviel Spalten. Vielleicht würdest Du auch sehen, dass die ausgegebenen Datensätze gar nicht die sind, die eingefügt werden sollen (weil fehlend).

Die Where Claus mit like ergibt keinen Sinn, nicht mal, wenn ein paar Studenten darunter sind die sich mögen.

Einfügen möchtest Du wohl die Datensätze, die nur in einer der Tabellen (die Backuptabelle) vorhanden sind. Das müsste in der Where Clause wiederzuerkennen sein, ist es aber nicht.
Um das zu erreichen würde man mit Outer Join arbeiten, statt Where Clause. Ich kenne gar keine Syntax, mit der man eine entsprechende Wirkung über die Where Clause erzielt bei MS SQL.
 
Alles Klar und Danke für den Input, dabadepdu. :-) Habe es jetzt wie folgt angepasst:

Insert into [Entwicklung].[dbo].[Abgaben_2] (STUDENT,AUFGNR, PUNKTE, NUMMER)
select t1.STUDENT, t1.AUFGNR, t1.PUNKTE, T1.Nummer FROM [Entwicklung].[dbo].[Abgaben_1] AS t1
Full join [Entwicklung].[dbo].[Abgaben_2] AS t2
on t1.STUDENT = t2.STUDENT where t2.STUDENT is NULL;
 
:eek:
Alles Klar und Danke für den Input, dabadepdu. :) Habe es jetzt wie folgt angepasst:

Insert into [Entwicklung].[dbo].[Abgaben_2] (STUDENT,AUFGNR, PUNKTE, NUMMER)
select t1.STUDENT, t1.AUFGNR, t1.PUNKTE, T1.Nummer FROM [Entwicklung].[dbo].[Abgaben_1] AS t1
Full join [Entwicklung].[dbo].[Abgaben_2] AS t2
on t1.STUDENT = t2.STUDENT where t2.STUDENT is NULL;
Fehlende Zeilen wirst du mit einem FULL JOIN nicht erhalten. Wie dabadepdu geschrieben hat ist ein LEFT JOIN nötig.

Um das zu erreichen würde man mit Outer Join arbeiten, statt Where Clause. Ich kenne gar keine Syntax, mit der man eine entsprechende Wirkung über die Where Clause erzielt bei MS SQL.

WHERE NOT EXISTS würde schon gehen aber einfacher wird das Statement damit auch nicht, höchstens performanter.
 
Nachsatz: Obs wirklich performanter geht als mit dem Join müsste man ausprobieren, jedenfalls müsste man dazu auf das NOT beim EXISTS verzichten.
 
Ich würde sagen der FULL JOIN funktioniert in dieser Situation wie beschrieben, ich wüsste nicht was daran falsch wäre.

Es gibt aber auch noch andere Wege, z.B. mit EXCEPT:
Code:
INSERT INTO Abgaben_2
SELECT * FROM Abgaben_1
EXCEPT
SELECT * FROM Abgaben_2

Ansonsten gibt es noch MERGE oder man könnte mit SELECT t1.* noch "verkürzen" aber EXCEPT ist eine schöne Sache.
 
Werbung:
Zurück
Oben