SQL-Abfrage vereinfachen
JCB
- datenbank
SELECT 'Hallöchen :)' as BEGRUESSUNG
Ich hab da folgende - stark vereinfachte + verkürzte - verschachtelte Abfrage:
ALTER PROCEDURE dbo.QMTEST_100
@Query varchar(200)
AS
SELECT
TB_QM_FM.ObjektID as ObjektID,
TB_QM_FM.KlassenID as KlassenID,
(SELECT RIGHT('000000' + CONVERT(varchar, ISNULL(TB_KUNDEN.KundenNr, 0)), 6)
+ ' - '
+ CASE ISNULL(TB_KUNDEN.NameIntern, '')
WHEN '' THEN ISNULL(TB_KUNDEN.Name, '')
ELSE ISNULL(TB_KUNDEN.NameIntern, '')
END
+ CASE ISNULL(TB_KUNDEN.Stammort, '')
WHEN '' THEN ''
ELSE ' (' + ISNULL(TB_KUNDEN.Stammort, '') + ')'
END
FROM TB_AUFTRAG
INNER JOIN TB_KUNDEN on TB_KUNDEN.ObjektID = TB_AUFTRAG.ClientID
AND TB_KUNDEN.KlassenID = TB_AUFTRAG.Clientklasse
WHERE TB_AUFTRAG.ObjektID=TB_QM_FM.AuftragID
AND TB_AUFTRAG.KlassenID=TB_QM_FM.AuftragCL) as Kunde
FROM TB_QM_FM
WHERE (SELECT RIGHT('000000' + CONVERT(varchar, ISNULL(TB_KUNDEN.KundenNr, 0)), 6)
+ ' - '
+ CASE ISNULL(TB_KUNDEN.NameIntern, '')
WHEN '' THEN ISNULL(TB_KUNDEN.Name, '')
ELSE ISNULL(TB_KUNDEN.NameIntern, '')
END
+ CASE ISNULL(TB_KUNDEN.Stammort, '')
WHEN '' THEN ''
ELSE ' (' + ISNULL(TB_KUNDEN.Stammort, '') + ')'
END
FROM TB_AUFTRAG
INNER JOIN TB_KUNDEN on TB_KUNDEN.ObjektID = TB_AUFTRAG.ClientID
AND TB_KUNDEN.KlassenID = TB_AUFTRAG.Clientklasse
WHERE TB_AUFTRAG.ObjektID=TB_QM_FM.AuftragID
AND TB_AUFTRAG.KlassenID=TB_QM_FM.AuftragCL) LIKE '%' + LTRIM(RTRIM(@Query)) + '%'
return
Jetzt meine Frage: wie kann ich diese Abfrage so vereinfachen, ohne dass ich die komplette Unterabfrage für die Spalte Kunde noch mal in der WHERE-Klausel angeben muß?? Die Hauptabfrage besteht nämlich noch aus weiteren u.U. noch komplizierteren Unterabfragen (welche dann auch LIKE @Query sein müssen). Somit muß ich immer alles doppelt schreiben. Mit weiteren (inner/outer) Joins in der Hauptabfrage gehts scheinbar nicht, weil sich die verschiedenen Relationen ins Gehege kommen. Ich habs zumindest nicht hinbekommen.
Für jegliche Anregung oder Lösung wär ich dankbar :).
Gruß,
Jan
grausam, einfach grausam.
sorry, aber DAS schaue ich mir nicht an.
wie wärs, wenn du erst einmal passende VIEWs basteln würdest. dann wird das ganze schon mal übersichtlicher.
diese VIEWs kannst du dann in der prozedur übersichtlicher verwenden.
möglicherweise entspringt das grauen auch aus einem grausamen datenmodell. dann sollte man das datenmodell evtl. erst einmal normalisieren.
Hi !
*Schnipp*
Was soll den am Ende herauskommen ?
Gruß
Hans
PRINT 'Hallo ;-)'
Da du kein DBMS angibst gehe ich mal davon aus, das du - wie ich - den MS SQL Server verwendest. Hier meine Tipps, ohne den Query wirklich verstanden zu haben:
1. Tabellennamen mit Alias abkürzen. Für kurze Queries mit weniger als drei Tabellen nehme ich meisten den Anfangsbuchstaben. Wichtig ist, dass die Abkürzungen aussagekräftig sind. Die Tabellennamen müssen das ohnehin sein. Den TB_-Präfix, der wohl für TaBelle steht, würde ich weglassen. Dadurch werden die Spaltenlisten und Join-Konstrukte viel lesbarer.
2. Sinnvoll einrücken. Bei stehen bei längeren Queries Select,
From, Where und Order immer auf einer neuen Zeile, wobei diese
selten länger als 80 Zeichen werden und jede weitere Zeile
eingerückt wird.
3. Für die Case-Konstrukte gibt es benutzerdefinierte Funktionen.
4. Komplexere Abfragen, welche oft gebraucht werden und auch als
Subquery zum Einsatz kommen sind Views sehr gut geeignet. Diese sollten immer gleich den passeneden Indexen versehen werden.
Soviel in Sachen SQL-Stil.
Solltest du wirklich den SQL Server verwenden, hast du ein anderes Problem: Meines Wissens nach können Parameter (@Query) nicht direkt als SQL-Statements ausgeführt werden. Du musst dir das ganze als String zusammenbasteln und zum Schluss mit einer stored Procedure ausführen. Deren Namen weiss ich jetzt leider nicht auswendig, aber du wirst sie bestimmt finden.
Gruss
Tom2