Hallo,
ich habe einmal eine Frage zum Umgang mit Views auf dem SQL - Server, die ich mal versuche an einem Beispiel zu erklären:
[highlight=sql]
CREATE TABLE Belege
(
...
Belegart Int,
Belegdatum DateTime,
KundeID int
...
)
GO
CREATE VIEW LetztesAngebot AS
(
SELECT KundeID, Max(Belegdatum) AS Belegdatum
FROM Belege
WHERE Belegart = 1 -- angebote
GROUP BY KundeID
)
GO
CREATE VIEW LetzteRechnung AS
(
SELECT Belegdatum, Max(Belegdatum) AS Belegdatum
FROM Belege
WHERE Belegart = 3 -- rechnungen
GROUP BY KundeID
)
GO
CREATE VIEW LetzterKontakt AS
(
SELECT COALESCE
(LetzteRechnung.Belegdatum, LetztesAngebot.Belegdatum) AS Datum
FROM
Belege
LEFT JOIN LetztesAngebot.KundeID = Belege.KundeID
LEFT JOIN LetzteRechnung.KundeID = Belege.KundeID
GO
[/highlight]
Meine Anwendung benutzt alle 3 Sichten, also LetztesAngebot und LetzteRechnung einzeln und dann auch in LetzterKontakt beide kombiniert.
In Wirklichkeit sind die Selektionskriterien viel komplizierter und parametrisiert, das hier ist nur eine Prinzipskizze.
Ich verspreche mir, dass, wenn die Einzelabfragen passen, auch die Gesamtabfrage passen muss.
Außerdem finde ich den Ansatz strukturierter, als die (gleichen) umfangreichen WHERE - Klauseln in mehreren Abfragen pflegen zu müssen.
Aber spricht designtechnisch und/oder performancetechnisch etwas grundsätzlich gegen solches Vorgehen?
Eure Meinungen würden dazu interessieren; ich hoffe, ich konnte das halbwegs verständlich erklären.
Danke
Tino
Edit:
Sehe gerade
[highlight=sql]
SELECT KundeID,Max(Belegdatum) ...
[/highlight]
Wäre eine Lösung für mein kleines Problembeispiel - aber das meine ich hier nicht.
Wie gesagt, es geht um das Verschachteln - eine Sicht in einer Sicht in einer Sicht .. auch über 4 - 5 Ebenen.
ich habe einmal eine Frage zum Umgang mit Views auf dem SQL - Server, die ich mal versuche an einem Beispiel zu erklären:
[highlight=sql]
CREATE TABLE Belege
(
...
Belegart Int,
Belegdatum DateTime,
KundeID int
...
)
GO
CREATE VIEW LetztesAngebot AS
(
SELECT KundeID, Max(Belegdatum) AS Belegdatum
FROM Belege
WHERE Belegart = 1 -- angebote
GROUP BY KundeID
)
GO
CREATE VIEW LetzteRechnung AS
(
SELECT Belegdatum, Max(Belegdatum) AS Belegdatum
FROM Belege
WHERE Belegart = 3 -- rechnungen
GROUP BY KundeID
)
GO
CREATE VIEW LetzterKontakt AS
(
SELECT COALESCE
(LetzteRechnung.Belegdatum, LetztesAngebot.Belegdatum) AS Datum
FROM
Belege
LEFT JOIN LetztesAngebot.KundeID = Belege.KundeID
LEFT JOIN LetzteRechnung.KundeID = Belege.KundeID
GO
[/highlight]
Meine Anwendung benutzt alle 3 Sichten, also LetztesAngebot und LetzteRechnung einzeln und dann auch in LetzterKontakt beide kombiniert.
In Wirklichkeit sind die Selektionskriterien viel komplizierter und parametrisiert, das hier ist nur eine Prinzipskizze.
Ich verspreche mir, dass, wenn die Einzelabfragen passen, auch die Gesamtabfrage passen muss.
Außerdem finde ich den Ansatz strukturierter, als die (gleichen) umfangreichen WHERE - Klauseln in mehreren Abfragen pflegen zu müssen.
Aber spricht designtechnisch und/oder performancetechnisch etwas grundsätzlich gegen solches Vorgehen?
Eure Meinungen würden dazu interessieren; ich hoffe, ich konnte das halbwegs verständlich erklären.
Danke
Tino
Edit:
Sehe gerade
[highlight=sql]
SELECT KundeID,Max(Belegdatum) ...
[/highlight]
Wäre eine Lösung für mein kleines Problembeispiel - aber das meine ich hier nicht.
Wie gesagt, es geht um das Verschachteln - eine Sicht in einer Sicht in einer Sicht .. auch über 4 - 5 Ebenen.
Comment