MSSQL 2005 -> UNION



  • Hallo Leute,

    ich habe in meinem SQL-View 2 Abfragen, deren Ergebnisse ich dann mit UNION zu einem einzigen Ergebnis kombiniere.

    In beiden Ergebnissen gibt es ein Bit-Feld, was aber von der Zusammenführung ausgeschlossen werden soll, es soll nicht relevant für einen Vergleich sein.

    Ich meine damit folgendes:
    Wenn aktuell 2 Ergebnisse die gleichen Spalteninhalte haben, sich aber in der Bit-Spalte unterscheiden, führt das UNION aktuell dazu, dass beide Ergebnisse im Endergebnis auftauchen, sich eben nur in dieser Spalte unterscheiden.

    Ich möchte, dass in so einem Fall, nur derjenige Eintrag auftaucht, der in der Bit-Spalte eine 1 enthält.

    Ist soetwas möglich?



  • Du könntest
    - in der zweiten View eine WHERE-Bedingung einbauen, die in einen Subquery sicherstellt, dass diese Zeile nicht bereits schon in der ersten vorhanden ist
    - nach den Union gruppieren und ebenfalls Duplikate eleminieren.
    Stammen denn beide Views von denselben Basistabellen und enthalten sie noch die Primärschlüssel?



  • witte_ schrieb:

    Stammen denn beide Views von denselben Basistabellen und enthalten sie noch die Primärschlüssel?

    Ja beide Views greifen primär auf die gleiche Basistabelle (+ diverse Joins) und enthalten immer noch die Primärschlüssel.

    Wie kann ich denn nach dem Union noch gruppieren?

    EDIT:

    Ich habe jetzt einfach mal ein GROUP BY mit SUM() auf mein View nachträglich in einer neuen Query laufen lassen, das funktioniert hervorragend.
    Nur würde ich gerne alles in einer Query haben...



  • Nach UNION gruppieren: Einfach Klammern setzen.
    Ist wie in der Mathematik.



  • Unix-Tom schrieb:

    Nach UNION gruppieren: Einfach Klammern setzen.
    Ist wie in der Mathematik.

    Hm, versteh ich nicht ganz.

    Ich habe folgende Struktur

    SELECT #1
    UNION
    SELECT #2

    Von diesem Endergebnis möchte ich nun gruppieren:

    SELECT GUID, MAX(Bitfeld) FROM
    (
    SELECT #1
    UNION
    SELECT #2
    ) GROUP BY GUID

    Wie selektiere ich von der durch UNION erzeugen Endtabelle noch etwas? Meine Syntax scheint falsch zu sein 😕



  • So wie Du es bereits geschrieben hast

    SELECT
    UNION
    SELECT

    Hierbei müssen beide SELECTS die gleiche Anzahl Felder und den gleichen Datentyp in diesen haben.

    (SELECT)
    UNION
    (SELECT)
    ORDER BY

    BEdenke das UNION nur 2 ROWSETS in ein neues zusammenfügt. Wass Du dabei selektierst ist der Union egal solange es gleicher Typ und Anzahl Spalten ist.

    Wenn du aber aus 2 Spalten nur bestimmte ROWS brauchst dann solltes Du dies in den SELECTS machen.
    Möchtest Du nun aus dem Ergebnis wieder gruppieren dann kannst Du vielleicht eine Tabelle im Speicher anlegen oder bereits ein JOIN oder was auch immer beim ersten SELECT.
    Wege gibt es viele und man müsste dann schauen welcher der effektivere und schnellere ist.



  • Aber du übersiehst doch, dass auf das Ergebnis aus dem UNION noch Aggregatfunktionen angewendet werden müssen. Du schreibst ja nur ein GROUP BY dahinter, was aber ist mit dem SELECT MAX() etc?



  • Aber Du kannst doch weiter gruppieren:

    SELECT GUID, MAX(Bitfeld),a,b,c FROM
    (
    SELECT #1
    UNION
    SELECT #2
    ) GROUP BY GUID,a,b,c

    Eine andere Alternative ist, das "Fleisch" später über den Primärschlüssel zu binden:

    SELECT * FROM
    (
    SELECT GUID, MAX(Bitfeld) FROM
    (
    SELECT #1
    UNION
    SELECT #2
    )
    GROUB BY GIUD
    ) ids
    JOIN myTable ON ids.GUID=myTable.GUID
    JOIN ...



  • witte schrieb:

    Aber Du kannst doch weiter gruppieren:

    SELECT GUID, MAX(Bitfeld),a,b,c FROM
    (
    SELECT #1
    UNION
    SELECT #2
    ) GROUP BY GUID,a,b,c

    Eben dieser Code funktioniert ja nicht... Dass ich weiter gruppieren kann, ist mir klar, aber daran liegts nicht.
    Ich bekomme die Fehlermeldung, "Incorrect syntax near the keyword 'GROUP'"



  • Ich kenne mich mit MSSQL nicht so aus. Muss die dynamic view einen alias haben?

    SELECT GUID, MAX(Bitfeld),a,b,c FROM
    (
    SELECT #1
    UNION
    SELECT #2
    ) AS v GROUP BY GUID,a,b,c


Anmelden zum Antworten