JCB: SQL-Abfrage vereinfachen

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

  1. 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.

  2. Hi !

    *Schnipp*

    Was soll den am Ende herauskommen ?

    Gruß

    Hans

  3. 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