Union



  • Ich möchte pro Tabellenzeile eine Funktion ausführen. Diese Funktion gibt jeweils mehrere Werte zurück. Am Ende soll ein View herauskommen wo alle Ergebnisse per UNION untereinander stehen. Prozedural sähe das so aus:

    UnionList L = new UnionList();
    For Each Row in Table
     L += Row.Execute(SQLFunction)
    Next
    

    Ich suche aber eine reine SQL Möglichkeit für den MS SQL Server?



  • Hi,

    zumindest in MS-Access-SQL kann man Funktionen statt mit Execute auch mit Open aufrufen. Mach dann einfach einen Join aus Ursprungstabelle und Funktion.

    Gruß Mümmel



  • Ich habe schon einen JOIN aus Tabelle und Funktion versucht:

    Select * FROM MyTable T INNER JOIN MyFunc(T.ID, T.Datum) Func ON T.ID = Func.ID

    geht aber nicht. Ich habe es jetzt doch prozedural gelößt. Danke für die Antwort 🙂



  • Hi,

    und wenn Du es mit verschachtelten Aufrufen versuchst, so im Sinne von

    select * from a inner join ( select * from funktion_c ) b on a.IDENT_NR = b.IDENT_NR

    bei Access geht es, zumindest mit ADO

    Gruß Mümmel



  • Das geht bei einer statischen Funktion, aber nicht wenn die Funktion Parameter übernehmen soll.

    Minimales Beispiel:
    Es soll ein View geschrieben werden der zu den Personen alle bisher geschehenen Geburtstagsfeiern auflistet.

    Tabelle Person: {ID, Geburtstag}
    Funktion Geburtstage: {ID, Geburtstag} -> {ID, Geburtstag0}, {ID, Geburtstag1}, {ID, Geburtstag2}, ...
    Es werden also alle bisher zum heutigen Datum geschehene Geburtstage ausgegeben.

    Der View der es machen soll:

    SELECT *
    FROM
     Personen
    INNER JOIN
     (SELECT * FROM Geburtstage(Personen.ID, Personen.Geburtstag)) GT
    ON Personen.ID = GT.ID
    

    Der SQL Server meldet:
    Der mehrteilige Bezeichner 'Personen.ID' konnte nicht gebunden werden.
    Der mehrteilige Bezeichner 'Personen.Geburtstag' konnte nicht gebunden werden.

    Das widerspricht vermutlich der Logik wie der MS SQL Server die Tabellen joined 😞



  • Ich habe jetzt auch bei Stackoverlfow gefragt. Man kann sowas über APPLY machen:

    Der APPLY-Operator ermöglicht Ihnen das Aufrufen einer Tabellenwertfunktion für sämtliche Zeilen, die von einem äußeren Ausdruck einer Tabelle einer Abfrage zurückgegeben werden. Die Tabellenwertfunktion dient als rechte Eingabe, der äußere /Ausdruck der Tabelle agiert als linke Eingabe. Die rechte Eingabe wird für jede Zeile aus der linken Eingabe ausgewertet, und die erstellten Zeilen werden für die endgültige Ausgabe kombiniert. Bei der Liste der vom APPLY-Operator erstellten Spalten handelt es sich um den Satz von Spalten in der linken Eingabe, gefolgt von der Liste der von der rechten Eingabe zurückgegebenen Spalten.

    Quelle: https://technet.microsoft.com/de-de/library/ms175156

    Im Geburtstagsbeispiel wäre dies die Lösung:

    SELECT * FROM Person
    CROSS APPLY(
        SELECT * FROM Geburtstage(Person.ID, Person.Geburtstag)   
    ) GB
    WHERE Person.ID = GB.ID
    

Anmelden zum Antworten