Frage

Angesichts der folgenden Definitionen:

CREATE TABLE MyTable
(
    col1 int,
    col2 int,
    col3 int,
    col4 int
)

CREATE FUNCTION fn_MyFunction
(
    @Param1 int,
    @Param2 int
)
RETURNS TABLE AS RETURN
(
    SELECT @Param1 * 2 AS 'res1', @Param2 * 4 AS 'res2', @Param1 AS 'col3'
)

Ich versuche, die Funktion zur Tabelle zu verbinden, damit ich einen kalkulierten Wert erhalte (s) pro Zeile. Beispiel: In einer Buchungstabelle muss ich den Preis basierend auf einem Startdatum und dem Enddatum erhalten.

Hier ist eine Beispielabfrage:

SELECT      tbl.col1
,           tbl.col2
,           tbl.col3
,           fn.res1
,           fn.res1
FROM        MyTable tbl
CROSS APPLY fn_MyFunction(tbl.col3, tbl.col4) fn
WHERE       fn.col3 = tbl.col3

Während ich denke, ich bekomme die richtigen Ergebnisse in meiner tatsächlichen Abfrage, wie geht es dem, wie das ist CROSS APPLY In diesem Fall die Ergebnisse erhalten? Bekommt es sie (effektiv) Reihen für Reihen? Oder funktioniert es in ähnlicher Weise wie CROSS JOIN (dh: Ein kartesischer Produkt machen)?

War es hilfreich?

Lösung

CROSS APPLY Nimmt eine Tabelle wertvolle Funktion und "Anwendet" -Parameter aus jeder Zeile in der Abfrage, auf die Sie sie anwenden. Die Funktion wird für jede Zeile einmal bewertet und die Ausgabe wird implizit mit der Quellzeile in dem Datensatzsatz verbunden, aus dem die Parameter erhalten wurden. Beachten Sie, dass dieser 'Join' 1: m sein kann - mit einer TVF -One -Zeile an der Quelle kann mehrere Ausgabezeilen aus dem TVF generieren.

Sie müssen in der WHERE -Klausel keine weiteren Prädikate verwenden, um den Ergebnissen zu verbinden, es sei denn, (aus irgendeinem Grund) möchten Sie die Ausgabe der Funktion weiter filtern, indem Sie ein zusätzliches Prädikat anwenden.

CROSS APPLY ist sehr nützlich bei XPath -Abfragen, wenn Sie sich um XML -Felder herum befassen müssen, die möglicherweise wiederholende Gruppen enthalten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit dba.stackexchange
scroll top