Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Tabelle vergleichen / Left Join bringt zu viele Spalten (https://www.delphipraxis.net/201314-tabelle-vergleichen-left-join-bringt-zu-viele-spalten.html)

Ykcim 11. Jul 2019 12:04

Datenbank: MySQL • Version: 5 • Zugriff über: UniDac

Tabelle vergleichen / Left Join bringt zu viele Spalten
 
Hallo Zusammen,

ich prüfe zwei Tabellen gegeneinander und schreibe die Unterschiede in eine dritte Tabelle.
Das Prüfen klappte eigentlich ganz gut, ich bekomme die richtigen Datensätze angezeigt.

Ich nutze diese Vorgehensweise auch, um unterschiedlich aufgebaute Tabellen anhand von zwei Feldern zu vergleichen. Auch das klappt eigentlich...

Mein Problem ist nur, dass mir dann die Spalten beider Tabellen ausgegeben werden und nicht nur die der Tabelle, die im select-statement steht.

Delphi-Quellcode:
select * from kommentfa a
  left join as400temp t on a.waaunr=t.waaunr and a.waaupo=t.waaupo
where t.waaunr is null
Ich bekomme die Spalten von der Tabelle kommentfa (hier stehen auch Werte in den Feldern) und die Spalten von Tabelle as400temp (hier sind logischer Werte alle NULL).

Kann mir jemand einen Tip geben, wie ich nur die Spalten von kommentfa bekomme? Ich möchte das Ganze nämlich mit einem INSERT verknüpfen.
Delphi-Quellcode:
insert into kommentfaarchiev
  select * from kommentfa a
    left join as400temp t on a.waaunr=t.waaunr and a.waaupo=t.waaupo
  where t.waaunr is null
Aktuell bekomme ich logischer Weise die Fehlermeldung: Column count doesn't match value count at row 1

Ich könnte natürlich statt
Delphi-Quellcode:
select * from
die einzelnen Felder auflisten. Aber ich muss das mit einigen großen Tabellen machen und müsste bei Änderungen noch auf eine weitere Procedure achten, deshalb bin ich froh, wenn ich das * behalten darf.

Hat jemand eine Idee?

Vielen Dank
Patrick

DeddyH 11. Jul 2019 12:06

AW: Tabelle vergleichen / Left Join bringt zu viele Werte
 
SQL-Code:
SELECT a.* FROM...

Delphi.Narium 11. Jul 2019 12:27

AW: Tabelle vergleichen / Left Join bringt zu viele Werte
 
Zitat:

Zitat von Ykcim (Beitrag 1436497)
Ich könnte natürlich statt
Delphi-Quellcode:
select * from
die einzelnen Felder auflisten.

Meiner Meinung nach das einzig sinnvolle Vorgehen. Und ja, bei Änderungen muss man diese dann vornehmen. Spart einem aber die Fehlersuchen, die aus Änderungen resultieren können. Und das müssen nicht unbedingt nur SQL-Fehler sein, sofern der Typ der Spalten übereinstimmt, können bei geänderter Spaltenreihenfolge durchaus die Daten in einer falschen Spalte landen und das muss man nicht zwingend sofort bemerken.
SQL-Code:
insert into kommentfaarchiev (benötigte Spalten)
  select benötigteSpalten from kommentfa a
    left join as400temp t on a.waaunr = t.waaunr and a.waaupo = t.waaupo
  where t.waaunr is null

Ykcim 11. Jul 2019 12:51

AW: Tabelle vergleichen / Left Join bringt zu viele Werte
 
Zitat:

SELECT a.* FROM...
Es kann so einfach sein...

Vielen Dank
Patrick

jobo 11. Jul 2019 13:11

AW: Tabelle vergleichen / Left Join bringt zu viele Spalten
 
Also ich bin ja ein großer Freund von "Select *", das betrifft aber die Arbeit mit Bibliotheken, die damit auch umgehen können.
Dass Dir die * Dynamik nichts nutzt, wenn der Rest (gerade bei einem Insert) nicht damit klar kommt, wurde ja schon erwähnt.

In der Situation "Och Menno, ich möchte nicht immer soviel tippen (und wer hat sich diese besch.. Spaltennamen eigentlich ausgedacht?!" (400 ++ Spalten oder was weiß ich), die ja offenbar trotz allen IDE Zaubers oft ein Problem darstellt*, nehme ich immer die Dictionary Views der Datenbank, um die Select Clause abzufragen.

Also für mySQL:
Code:
SELECT COLUMN_NAME
  FROM INFORMATION_SCHEMA.COLUMNS
  WHERE table_name = 'tbl_name'
Das ist nicht meine Erfindung, sondern glaub ich sehr verbreitet, Code Generierung allgemein ist ja recht praktisch.

Wenn man mag, kann man sich gleich noch das Komma ausgeben lassen. Oder bei mySQL meinetwegen auch noch diesen ganzen Mist mit Ticks oder Backticks anheften.
Man kann es auch einmal für alle Tabellen laufen lassen und sich das Ergebnis in Excel eintüten. Dann bequem nach Tabellen filtern (per Klick), was man braucht. Da besteht allerdings Veraltungsgefahr, aber Excel kann ja auch dynamisch DB-Daten anzeigen.
Copy/Paste ist jedenfalls unschlagbar gegen simple Tippfehler und spart auch Zeit, wenn es nicht nur um 5 Felder geht.

*gibt es nicht seit längerem einen DB Explorer in der IDE?


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:24 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz