MSSQL Tabellenspalten vergleichen



  • Hi,

    ich verwende ein Subquery zur Auswahl meiner Einträge. Das sieht etwa so aus:

    SELECT *
    FROM Data
    WHERE
      Data.A = (
        SELECT MAX(A)
        FROM Data SubTbl
        WHERE
          SubTbl.B = Data.B AND
          SubTbl.C = Data.C AND
          SubTbl.D = Data.D
      )
    

    Jetzt muss ich immer eine Liste mit allen Spalten hintereinander schreiben. Gibt es eine Möglichkeit, einen Spaltenbereich einer Table mit dem einer anderen Table zu vergleichen? Sowas in der Art:

    SELECT *
    FROM Data
    WHERE
      Data.A = (
        SELECT MAX(A)
        FROM Data SubTbl
        WHERE SubTbl.(B,C,D) = Data.(B,C,D)
      )
    


  • Hi,

    warum musst Du das immer wieder schreiben. In MS-SQL gibts doch die Möglihckeit von Funktionen und Prozeduren. Einmal definiert und schon hat man's für immer. Notfalls die entsprechenden Funtkionen mit einem Quelltextgenereator automatisch erzeugen lassen.

    Gruß Mümmel



  • Ich muss das immer wieder machen, weil ich eine Menge Tabellen hab, bei denen ich immer ähnlich strukturierte Abfragen machen muss. Ich möchte mir damit gerne Schreibarbeit und Fehlerquellen sparen (passiert schonmal, dass ich ne Spalte vergesse).
    Die Abfrage benötige ich aber für jede Tabelle nur einmal. Darum kann ich mir ne extra Prozedur denk ich sparen...



  • Hi Heimchen,

    dann kann ich Dir eigentlich nur dazu raten, Dir da mit normalen Programmiermitteln ein Hilfstool zu bilden. Teile erst mal Deinen Select in verwchiedene Teile auf, die Du jeweils auswählen kannst und bilde daraus dann einen SQL-Ausdruck, den Du entweder über die Zwischenablage übergibst oder gleich ausführst.
    Eine Möglichkeit wäre z.B. eine Datenbank wo in den einzelnen Feldern eines Datensatzes jeweils die Teilausdrücke stehen.
    Oder Du baust Dir ne Benutzeroberfläche, wo jeweils die Codeschnipse, die Tabellen, und nach deren Auswahl die darin enthaltenen Felder angezeigt werden, und Du fügst Stück für Stück durch anklicken an, wenn zwei Tabellen markiert sind eben als Vergleich A.Feld = B.Feld ...
    Eine weiter Möglihckeit ist, dass Du die einzelnen Teile in einem Exceltableau vorgibst und das dann Zeile für Zeile scannst und daraus die entsprechenden Befehle zusammensetzen lässt. Die Variante hat sich bei mir ziemlich bewährt.

    Gruß Mümmel



  • Hm,

    da ich so oder so immer alles schreiben muss, kann ich auch gleich bei meiner Variante bleiben. Brauche den Query für jede einzelne Tabelle höchstens ein oder zwei Mal.
    Ich könnte hergehen und mir die Identity (darum gehts hier nämlich) aus der Datnbank lesen und mir dann den Query daraus zusammenbauen. Aber ich denke, der Aufwand für den Code rechtfertigt nicht den Nutzen... 😞



  • Hi Heimchen,

    ich denke nicht, daß ein direkter Kosten-nutzen-Vergleich hier weiter führt. Wenn man einen Ansatz offen genug hält lässt der sich vielfach noch weiter verwenden.
    So kleineWerkzeuge mit denen man in Datenbanken rumschnüffeln kann sind auf die Dauer Gold wert, weil man die eben nicht als große Alleskönner kauft, sondern sich selbst ein kleines Tool für die eigene Arbeit macht, was genau auf den eigenen Bedarf zugeschnitten ist. Und jedes mal wenn wieder ne neue Anforderung kommt, wird es etwas erweitert, und irgendwann hat man ne eierlegende Wollmilchsau die genau für die eigenen Bedürfnisse optimiert ist.
    In Deinem Fall ist das sogar recht einfach, da ja anscheinend immer die gleiche Syntax des SQL-Befehls verwendet werden soll.
    Du liest einfach alle Tabellennamen, Feldnamen, und Indexe einschließlich der Felder aus denen sie aufgebaut sind aus der Datenbank aus und speicherst sie in einer separaten Datenbank (in dem Fall am einfachsten in einer Access-mdb).
    Anschließend lässt Du Dir jeweils mit ner geeigneten SQL-Abfrage jeweils alles in Frage kommende anbieten und wählst nur noch aus, was davon wirklich verwendet werden soll. Wenn man das statt in C++ in Delphi macht (für so kleine Sachen aus meiner Sicht geeigneter) dann hält sich der Aufwand da sehr in Grenzen.

    Gruß Mümmel



  • muemmel schrieb:

    Du liest einfach alle Tabellennamen, Feldnamen, und Indexe einschließlich der Felder aus denen sie aufgebaut sind aus der Datenbank aus und speicherst sie in einer separaten Datenbank (in dem Fall am einfachsten in einer Access-mdb).

    Nur mal am Rande: Wozu braucht man da eine zweite Datenbank? Wenn du die Datenbankstruktur auslesen kannst, kannst du das auch direkt nutzen, um die benötigten Anweisungen zusammenzustellen.


Anmelden zum Antworten