Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi SQL Optimierung / Erweiterung (https://www.delphipraxis.net/147080-sql-optimierung-erweiterung.html)

manfred_h 1. Feb 2010 15:39

Datenbank: MySQL • Version: 5.0.85-community • Zugriff über: copycat

SQL Optimierung / Erweiterung
 
Hallo zusammen

für die Benutzerauthentifizierung auf dem MySQL Server verwende ich folgende funktionierenden SQL:
SQL-Code:
( MEMBER_GROUP = 'ADMIN')
OR (( MEMBER_GROUP = 'CAMP') AND (CONDITION_VALUE = NEW.C_NO))
OR (NEW.C_NO IN (SELECT RPL$GROUPS_RIGHTS.CAMP_NO
    FROM RPL$GROUPS JOIN RPL$GROUPS_RIGHTS ON RPL$GROUPS_RIGHTS.GROUP_NO = RPL$GROUPS.GROUP_NO
    WHERE RPL$GROUPS.GROUP_NO = MEMBER_GROUP))
diesen möchte ich nun ein wenig erweitern / um die Abfrage von 2 Tabellen ungefähr so:
SQL-Code:
( MEMBER_GROUP = 'ADMIN')
OR (( MEMBER_GROUP = 'CAMP')
      AND (CONDITION_VALUE = NEW.C_NO)
      AND (NEW.SERVICE_NAME IN (SELECT RPL$SERVICE_TABLES.TABLE_NAME
           FROM RPL$SERVICE JOIN RPL$SERVICE_TABLES ON RPL$SERVICE_TABLES.SERVICE_NAME = RPL$SERVICE.SERVICE_NAME
           WHERE RPL$SERVICE.SERVICE_NAME LIKE SERVICE))
    )
OR (NEW.C_NO IN (SELECT RPL$GROUPS_RIGHTS.CAMP_NO
    FROM RPL$GROUPS JOIN RPL$GROUPS_RIGHTS ON RPL$GROUPS_RIGHTS.GROUP_NO = RPL$GROUPS.GROUP_NO
    WHERE RPL$GROUPS.GROUP_NO = MEMBER_GROUP)
    AND (NEW.SERVICE_NAME IN (SELECT RPL$SERVICE_TABLES.TABLE_NAME
           FROM RPL$SERVICE JOIN RPL$SERVICE_TABLES ON RPL$SERVICE_TABLES.SERVICE_NAME = RPL$SERVICE.SERVICE_NAME
           WHERE RPL$SERVICE.SERVICE_NAME LIKE NEW.SERVICE)))
    )
Die 2 Tabellen sind:
RPL$SERVICE
Felder: SERVICE_NAME
RPL$SERVICE_TABLES
Felder: SERVICE_NAME / TABLE_NAME

Ein Problem ist dass ich in der aktuellen Tabelle ein Feld ( NEW.SERVICE )habe das mehrere Werte beinhalten kann.
( z.B Hotel / Altersheim ... ) Es soll nun geprüft werden ob in RPL$SERVICE.SERVICE_NAME ein Wert vorhanden ist
der im Feld NEW.SERVICE auftaucht ( Es können auch mehrere sein ).

Wie kann ich auf diese in dieser SQL zugreifen?
Wenn Ihr noch Tipps für die Optimierung oder Vereinfachung habt bin ich dankbar.
Hoffe ich konnte die Frage verständlich erläutern.

Manfred

manfred_h 3. Feb 2010 11:01

Re: SQL Optimierung / Erweiterung
 
konnte eine kleine Optimierung am SQL-String vornehmen:
SQL-Code:
( MEMBER_GROUP = 'ADMIN')
OR (( MEMBER_GROUP = 'CAMP')
      AND (CONDITION_VALUE = NEW.C_NO)
      AND (NEW.SERVICE_NAME IN (SELECT ST.TABLE_NAME
           FROM RPL$SERVICE S JOIN RPL$SERVICE_TABLES ST ON ST.SERVICE_NAME = S.SERVICE_NAME
           WHERE S.SERVICE_NAME LIKE NEW.SERVICE)))
    )
OR (NEW.C_NO IN (SELECT GR.CAMP_NO
    FROM RPL$GROUPS G JOIN RPL$GROUPS_RIGHTS GR ON GR.GROUP_NO = G.GROUP_NO
    WHERE G.GROUP_NO = MEMBER_GROUP)
    AND (NEW.SERVICE_NAME IN (SELECT ST.TABLE_NAME
           FROM RPL$SERVICE S JOIN RPL$SERVICE_TABLES ST ON ST.SERVICE_NAME = S.SERVICE_NAME
           WHERE S.SERVICE_NAME LIKE NEW.SERVICE)))
    )
was leider immer noch nicht klar ist:
Zitat:

Ein Problem ist dass ich in der aktuellen Tabelle ein Feld ( NEW.SERVICE )habe das mehrere Werte beinhalten kann.
( z.B Hotel / Altersheim ... ) Es soll nun geprüft werden ob in RPL$SERVICE.SERVICE_NAME ein Wert vorhanden ist
der im Feld NEW.SERVICE auftaucht ( Es können auch mehrere sein ).
> siehe erstes Posting

währe hier für einen Tipp dankbar.
Manfred

DeddyH 3. Feb 2010 11:17

Re: SQL Optimierung / Erweiterung
 
Zitat:

Ein Problem ist dass ich in der aktuellen Tabelle ein Feld ( NEW.SERVICE )habe das mehrere Werte beinhalten kann.
Das lässt auf suboptimales Design schließen (nicht-atomare Daten), wodurch Deine Probleme verursacht werden.

manfred_h 3. Feb 2010 12:50

Re: SQL Optimierung / Erweiterung
 
Zitat:

Zitat von DeddyH
Das lässt auf suboptimales Design schließen (nicht-atomare Daten), wodurch Deine Probleme verursacht werden.

Dieses Design ist u.A durch eine Replications-Komponente vorgegeben.
Das lässt sich in einem gewissen Ramen anpassen.
Habe gerade noch das gefunden:
http://dev.mysql.com/doc/refman/5.0/...function_match

werde mich damit wohl ein wenig beschäftigen.
MATCH (col1,col2,...) AGAINST (expr [search_modifier])

Manfred

manfred_h 5. Feb 2010 13:46

Re: SQL Optimierung / Erweiterung
 
Bin nun ein wenig weitergekommen.
SQL-Code:
( MEMBER_GROUP = 'ADMIN')
OR (( MEMBER_GROUP = 'CAMP')
      AND (CONDITION_VALUE = NEW.C_NO)
      AND ('MEMBER' IN (SELECT ST.TABLE_NAME
           FROM RPL$SERVICE S JOIN RPL$SERVICE_TABLES ST ON ST.SERVICE_NAME = S.SERVICE_NAME
           WHERE S.SERVICE_NAME =(SERVICE LIKE ('%MEMBER%') ))))
OR (NEW.C_NO IN (SELECT GR.CAMP_NO
      FROM RPL$GROUPS G JOIN RPL$GROUPS_RIGHTS GR ON GR.GROUP_NO = G.GROUP_NO
      WHERE G.GROUP_NO = MEMBER_GROUP)
    AND ('MEMBER' IN (SELECT ST.TABLE_NAME
           FROM RPL$SERVICE S JOIN RPL$SERVICE_TABLES ST ON ST.SERVICE_NAME = S.SERVICE_NAME
           WHERE S.SERVICE_NAME =(SERVICE LIKE ('%MEMBER%') ))))
es besteht so wie es aussieht nur noch ein Problem mit diesem Punkt hier.
SQL-Code:
WHERE S.SERVICE_NAME =(SERVICE LIKE ('%MEMBER%') ))))
Das geht so nicht ... eine kleine Hilfe?

Manfred

hoika 6. Feb 2010 15:10

Re: SQL Optimierung / Erweiterung
 
Hallo,

SQL-Code:
WHERE S.SERVICE_NAME =(SERVICE LIKE ('%MEMBER%') ))))
Merkwürdiges Statement.

SQL-Code:
WHERE S.SERVICE_NAME LIKE '%MEMBER%'

Heiko

manfred_h 6. Feb 2010 16:16

Re: SQL Optimierung / Erweiterung
 
Zitat:

Zitat von hoika
SQL-Code:
WHERE S.SERVICE_NAME LIKE '%MEMBER%'

Hallo hoika
Danke für Deinen Tipp, leider geht das so auch nicht.

Es soll am Ende ja "verglichen" werden das SERVICE den String 'MEMBER' enthält und
auch in WHERE S.SERVICE_NAME vorkommt. Als kleines funktionierendes Bsp.
SQL-Code:
( MEMBER_GROUP = 'ADMIN')
OR (( MEMBER_GROUP = 'CAMP') AND (CONDITION_VALUE = NEW.C_NO))
OR (NEW.C_NO IN (SELECT RPL$GROUPS_RIGHTS.CAMP_NO
    FROM RPL$GROUPS JOIN RPL$GROUPS_RIGHTS ON RPL$GROUPS_RIGHTS.GROUP_NO = RPL$GROUPS.GROUP_NO
    WHERE RPL$GROUPS.GROUP_NO = MEMBER_GROUP))
Dies möchte ich Erweitern wie im vorigen Bsp. Das Problem ist nur das SERVICE mehre Einträge
beinhalten kann aus diesem Grund habe ich das mit
SQL-Code:
WHERE S.SERVICE_NAME =(SERVICE LIKE ('%MEMBER%') ))))
ausgedacht. Leider noch ohne Erfolg.

omata 6. Feb 2010 16:41

Re: SQL Optimierung / Erweiterung
 
Vielleicht so...
SQL-Code:
WHERE SERVICE LIKE '%MEMBER%'
  AND SERVICE_NAME LIKE '%' + SERVICE + '%'

manfred_h 6. Feb 2010 17:05

Re: SQL Optimierung / Erweiterung
 
Zitat:

Zitat von omata
Vielleicht so...
SQL-Code:
WHERE SERVICE LIKE '%MEMBER%'
  AND SERVICE_NAME LIKE '%' + SERVICE + '%'

Danke omata für Deinen Tipp.
Leider geht das auch nicht. Habe echt schon div. Varianten durchgetestet.
z.B.
SQL-Code:
WHERE S.SERVICE_NAME AND SERVICE LIKE '%MEMBER%' )))
will er auch nicht, und auch das nicht
SQL-Code:
 WHERE S.SERVICE_NAME AND LIKE '%MEMBER%' AND SERVICE LIKE '%MEMBER%')))
Dies widerum geht einwandfrei solange ich nur einen Wert in dem Feld habe:
SQL-Code:
( MEMBER_GROUP = 'ADMIN')
OR (( MEMBER_GROUP = 'CAMP')
      AND (CONDITION_VALUE = NEW.C_NO)
      AND ('MEMBER' IN (SELECT ST.TABLE_NAME
           FROM RPL$SERVICE S JOIN RPL$SERVICE_TABLES ST ON ST.SERVICE_NAME = S.SERVICE_NAME
           WHERE S.SERVICE_NAME = SERVICE))
   )
OR (NEW.C_NO IN (SELECT GR.CAMP_NO
      FROM RPL$GROUPS G JOIN RPL$GROUPS_RIGHTS GR ON GR.GROUP_NO = G.GROUP_NO
      WHERE G.GROUP_NO = MEMBER_GROUP)
    AND ('MEMBER' IN (SELECT ST.TABLE_NAME
           FROM RPL$SERVICE S JOIN RPL$SERVICE_TABLES ST ON ST.SERVICE_NAME = S.SERVICE_NAME
           WHERE S.SERVICE_NAME = SERVICE)))

omata 6. Feb 2010 19:36

Re: SQL Optimierung / Erweiterung
 
Zitat:

Zitat von manfred_h
Dies widerum geht einwandfrei solange ich nur einen Wert in dem Feld habe:

Du redest in Rätseln! So kann man dir nicht helfen! Bitte artikuliere dich konkreter!

Was geht dann nicht? gibt es eine Fehlermeldung, wenn es mehrere Werte sind? Oder gibt das Statement nicht die richtigen Zeilen zurück? Welches Feld ist in deiner Aussage gemeint?

Zitat:

Zitat von manfred_h
Ein Problem ist dass ich in der aktuellen Tabelle ein Feld ( NEW.SERVICE )habe das mehrere Werte beinhalten kann.
( z.B Hotel / Altersheim ... ) Es soll nun geprüft werden ob in RPL$SERVICE.SERVICE_NAME ein Wert vorhanden ist
der im Feld NEW.SERVICE auftaucht ( Es können auch mehrere sein ).

Kannst du diese Aussage mal etwas besser darlegen? "Es können auch mehrere sein" wie muss ich mir das vorstellen? Sind diese Angaben in Zeilen oder in Spalten angelegt? Innerhalb einer Zelle? Wenn ja, wie separiert? Oder wenn (hoffentlich) nein, also in Zeilen, wie sieht das konkret aus? Beispiel! Tabellen + Inhalt + Ergebnis

Zitat:

Zitat von manfred_h
SQL-Code:
OR (NEW.C_NO IN (SELECT RPL$GROUPS_RIGHTS.CAMP_NO
                 FROM RPL$GROUPS
                 INNER JOIN RPL$GROUPS_RIGHTS
                   ON RPL$GROUPS_RIGHTS.GROUP_NO = RPL$GROUPS.GROUP_NO
                 WHERE RPL$GROUPS.GROUP_NO = MEMBER_GROUP))

Wo kommt in diesem Teil deines Statements "MEMBER_GROUP" her? Außerhalb der Unterabfrage? Wenn ja, dann ist das hier eine ganz schlechte Wahl, weil man den IN-Operator niemals mit der äußeren Abfrage über die WHERE-Klausel koppeln sollte. Dafür gibt es den EXISTS-Operator, der ist genau für soetwas vorhanden:
Zitat:

Zitat von manfred_h
SQL-Code:
OR (EXISTS (SELECT *
            FROM RPL$GROUPS
            INNER JOIN RPL$GROUPS_RIGHTS
              ON RPL$GROUPS_RIGHTS.GROUP_NO = RPL$GROUPS.GROUP_NO
            WHERE RPL$GROUPS.GROUP_NO = x.MEMBER_GROUP
              AND RPL$GROUPS_RIGHTS.CAMP_NO = NEW.C_NO))

Wobei ich mir dann einen Alias bei "MEMBER_GROUP" wünschen würde.

Sorry, für die vielen Fragen. Aber diesen Eiertanz hier um die eigentliche Lösung, konnte ich nicht mehr mit ansehen. Fangen wir einfach nochmal an, erkläre dein Problem erstmal ausführlich und so, dass auch jemand, der dein System nicht sehen kann, auch versteht, was du da hast und vor allen Dingen, was du eigentlich genau wie haben möchtest.

Anderen ist das vielleicht alles klar, mir nicht. Falls dir das zu viele Fragen sind, dann ignoriere mich einfach und ich beschäftige mich nicht weiter mit deinem Problem.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:29 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz