Glengamoi · AspHeute (Artikel) · .NET Heute (RSS-Suche) · .NET Blogs · Glengamoi Suche (Installieren via Klick)

Glengamoi

Die Diskussionsforen der deutschen .NET Community
Willkommen bei Glengamoi. Anmeldung | Registrieren | Hilfe
in Suchen

Function in Join mit Parameter nutzen

Letzter Beitrag 11-08-2008 20:49 von NicClarke. 9 Antworten.
Seite 1 von 1 (10 Treffer)
Beiträge sortieren: Zurück Weiter
  • 09-25-2008 0:06

    Function in Join mit Parameter nutzen

     Hallo

     Eine Function im SQL Server liefert mir Daten, welche mit einem Join mit einer weiteren Tabelle verknüpft werden soll. Dabei sollen Werte aus der Tabelle an die Funktion übergeben werden, damit der Rückgabewert abhängig von diesen Werte aufgebaut werden kann.

     Also inetwa so:


    SELECT   * FROM a LEFT OUTER JOIN 
    functionB(a.id) AS b ON a.id=b.id

     Das bringt mir aber den Fehle:

    Der mehrteilige Bezeichner "a.ID" konnte nicht gebunden werden.

     

    Gemand einen Tipp dazu?

    Gruss Christoph

    • IP-Adresse ist Registriert
  • 09-25-2008 8:42 Antwort zu

    • IvoLooser
    • Top 75 Mitwirkender
    • Registriert am 03-03-2006
    • Oberuzwil
    • Beiträge 48

    Re: Function in Join mit Parameter nutzen

    Hallo Christoph
     
    Wir haben das bei und so gelöst.
     
    SELECT     *
    FROM         Product INNER JOIN
                          ProductPhoto ON dbo.cleanupProduct(Product.ProductPhotoID) = ProductPhoto.ProductPhotoID
     
    Vermutlich müsste dein Query so lauten:
     
    SELECT   * FROM a LEFT OUTER JOIN b ON a.id=functionB(b.id)
     
    Gruss Ivo

    2008/9/25 ChristophSchmid <bounce-ChristophSchmid@glengamoi.com>

     Hallo

     Eine Function im SQL Server liefert mir Daten, welche mit einem Join mit einer weiteren Tabelle verknüpft werden soll. Dabei sollen Werte aus der Tabelle an die Funktion übergeben werden, damit der Rückgabewert abhängig von diesen Werte aufgebaut werden kann.

     Also inetwa so:


    SELECT   * FROM a LEFT OUTER JOIN 
    functionB(a.id) AS b ON a.id=b.id

     Das bringt mir aber den Fehle:

    Der mehrteilige Bezeichner "a.ID" konnte nicht gebunden werden.

     

    Gemand einen Tipp dazu?

    Gruss Christoph





    Ivo Looser
    Systemmanager
    http://blog.keystroke.ch
    • IP-Adresse ist Registriert
  • 09-25-2008 9:07 Antwort zu

    Re: Function in Join mit Parameter nutzen

     Hallo Ivo

    Deine cleanupProduct liefert wohl eine einzelne ID zurück, bei mir möchte ich darin ein Select mit UNION und eben diesen übergebenen Filterwerten zurückliefern. 

    Aktuell habe ich z.B. die Abfrage(Tippfehler seien verziehen)

    Select * from a left outer join (select * from c union select * from d) as b where a.id=b.id and a.id=40

    Die interne Abfrage mit dem union ist in wirklichkeit komplizierter und dauert recht lange. Habe daher gehofft, dass ich mit der übergabe vom id-Wert die UNION-Abfrage bereits da klein halten kann. Die Abfrage wird dann selber wieder in einer View genutzt und da kommt dann der 40 aus dieser Spalte.

     

    Gruss Christoph

    • IP-Adresse ist Registriert
  • 09-25-2008 13:28 Antwort zu

    • IvoLooser
    • Top 75 Mitwirkender
    • Registriert am 03-03-2006
    • Oberuzwil
    • Beiträge 48

    Re: Function in Join mit Parameter nutzen

    Hallo Christoph
     
     
    Select * from a left outer join (
      select * from c where c.id = 40
      union
      select * from d where d.id = 40)
     as b where a.id=b.id and a.id=40
     
    Könnte, je nach index sein das die Abfrage dadurch beschleunigt wird.
     
    Gruss Ivo

    2008/9/25 ChristophSchmid <bounce-ChristophSchmid@glengamoi.com>

     Hallo Ivo

    Deine cleanupProduct liefert wohl eine einzelne ID zurück, bei mir möchte ich darin ein Select mit UNION und eben diesen übergebenen Filterwerten zurückliefern. 

    Aktuell habe ich z.B. die Abfrage(Tippfehler seien verziehen)

    Select * from a left outer join (select * from c union select * from d) as b where a.id=b.id and a.id=40

    Die interne Abfrage mit dem union ist in wirklichkeit komplizierter und dauert recht lange. Habe daher gehofft, dass ich mit der übergabe vom id-Wert die UNION-Abfrage bereits da klein halten kann. Die Abfrage wird dann selber wieder in einer View genutzt und da kommt dann der 40 aus dieser Spalte.

     

    Gruss Christoph





    Ivo Looser
    Systemmanager
    http://blog.keystroke.ch
    • IP-Adresse ist Registriert
  • 09-25-2008 13:43 Antwort zu

    Re: Function in Join mit Parameter nutzen

     Weil das 40 aber eben nicht fest ist sondern aus einer anderen View welche diese View mit Join verbindet, geht das so nicht.

    Wenn ich anstelle von 40 a.id schreibe, geht es eben nicht. Daher der Versuch, den Parameter einer Funktion zu übergeben und es da zu machen.

    Gruss Christoph

    • IP-Adresse ist Registriert
  • 09-25-2008 15:04 Antwort zu

    • IvoLooser
    • Top 75 Mitwirkender
    • Registriert am 03-03-2006
    • Oberuzwil
    • Beiträge 48

    Re: Function in Join mit Parameter nutzen

    Hallo Christoph
     
    So ganz genau habe ich noch nicht verstanden wo das genau das Problem liegt. Tut mir leid. Ich versuches nochmal.
     
    Hättest du gern sowas Tablevalue Parameters?
     
    Vieleicht suchst du so was?
     
    Select * from a left outer join (
      select * from c where c.id in(select a.id from a) 
      union
      select * from d where d.id in(select a.id from a))
     as b where a.id=b.id and a.id=40
     
    Gruss Ivo
    2008/9/25 ChristophSchmid <bounce-ChristophSchmid@glengamoi.com>

     Weil das 40 aber eben nicht fest ist sondern aus einer anderen View welche diese View mit Join verbindet, geht das so nicht.

    Wenn ich anstelle von 40 a.id schreibe, geht es eben nicht. Daher der Versuch, den Parameter einer Funktion zu übergeben und es da zu machen.

    Gruss Christoph





    Ivo Looser
    Systemmanager
    http://blog.keystroke.ch
    • IP-Adresse ist Registriert
  • 10-06-2008 21:57 Antwort zu

    AW: Function in Join mit Parameter nutzen

    Liefert die Funktion eine Tabelle oder einen einzelnen Wert zurück?

    Wenn das nur ein Wert ist, würde ich das in einer Unterabfrage isolieren / kapseln:

     Select A.id, functionB(A.id) As Ergebnis From Tabelle As A

     

    Das läßt sich dann regulär in einer Join-Klausel verwenden.

    • IP-Adresse ist Registriert
  • 10-06-2008 23:41 Antwort zu

    Re: AW: Function in Join mit Parameter nutzen

     Nein, es ist eben nicht ein Wert sondern eine Tabelle.

    • IP-Adresse ist Registriert
  • 10-07-2008 12:06 Antwort zu

    AW: Re: AW: Function in Join mit Parameter nutzen

    Wenn man einen Left Join nutzt und die linke Tabelle eher klein ist, sollte normalerweise der Optimierer den rechten Ausdruck ohnehin höchstens für die links auftretenden Werte berechnen.

    Wenn man Views nutzt, kann es passieren, daß die Indices nicht mehr verwendet werden. Da müßte man sich den Ablaufplan der ganzen Abfrage ansehen.

    ChristophSchmid:
    Aktuell habe ich z.B. die Abfrage(Tippfehler seien verziehen)

    Select * from a left outer join (select * from c union select * from d) as b where a.id=b.id and a.id=40

    Die interne Abfrage mit dem union ist in wirklichkeit komplizierter und dauert recht lange. Habe daher gehofft, dass ich mit der übergabe vom id-Wert die UNION-Abfrage bereits da klein halten kann. Die Abfrage wird dann selber wieder in einer View genutzt und da kommt dann der 40 aus dieser Spalte.

    Korreliertes Verwenden eines 'äußeren Wertes' geht nur bei korrelierten Unterabfragen. Wenn das Gesamtkonstrukt selbst innerhalb einer übergeordneten Struktur in Form einer Unterabfrage genutzt wird,dann kann das drumherum seinen Wert X.id an verschiedene Stellen (Where-Klausel außen und innen) durchreichen. Damit dürfte der innere Join-Ausdruck auch bloß noch das berechnen, was er soll.

    PS: Left Join mit On formulieren, also

    Select * from a left outer join (select * from c union select * from d) as b On a.id=b.id Where a.id=40


    Womöglich löst der Abfrageoptimierer dieses etwas untypische Konstrukt komisch auf (hängt m.W. nach auch von der Lizenz ab).
    • IP-Adresse ist Registriert
  • 11-08-2008 20:49 Antwort zu

    AW: Function in Join mit Parameter nutzen

    Hi Christoph,

     SQL Server 2005???

    SELECT   * FROM
    OUTER APPLY functionB(a.id)             -- outer apply == outer join & cross apply == inner join

    Grüße

    Nic

    • IP-Adresse ist Registriert
Seite 1 von 1 (10 Treffer)