AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi SQL Optimierung / Erweiterung
Thema durchsuchen
Ansicht
Themen-Optionen

SQL Optimierung / Erweiterung

Ein Thema von manfred_h · begonnen am 1. Feb 2010 · letzter Beitrag vom 18. Feb 2010
Antwort Antwort
Seite 1 von 2  1 2      
manfred_h

Registriert seit: 4. Nov 2005
Ort: Basel
442 Beiträge
 
Delphi XE2 Enterprise
 
#1

SQL Optimierung / Erweiterung

  Alt 1. Feb 2010, 16:39
Datenbank: MySQL • Version: 5.0.85-community • Zugriff über: copycat
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
  Mit Zitat antworten Zitat
manfred_h

Registriert seit: 4. Nov 2005
Ort: Basel
442 Beiträge
 
Delphi XE2 Enterprise
 
#2

Re: SQL Optimierung / Erweiterung

  Alt 3. Feb 2010, 12:01
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
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#3

Re: SQL Optimierung / Erweiterung

  Alt 3. Feb 2010, 12:17
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
manfred_h

Registriert seit: 4. Nov 2005
Ort: Basel
442 Beiträge
 
Delphi XE2 Enterprise
 
#4

Re: SQL Optimierung / Erweiterung

  Alt 3. Feb 2010, 13:50
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
  Mit Zitat antworten Zitat
manfred_h

Registriert seit: 4. Nov 2005
Ort: Basel
442 Beiträge
 
Delphi XE2 Enterprise
 
#5

Re: SQL Optimierung / Erweiterung

  Alt 5. Feb 2010, 14:46
Bin nun ein wenig weitergekommen.
SQL-Code:
( MEMBER_GROUP = 'ADMIN')
OR (( MEMBER_GROUP = 'CAMP')
      AND (CONDITION_VALUE = NEW.C_NO)
      AND ('MEMBERIN (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 ('MEMBERIN (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.
WHERE S.SERVICE_NAME =(SERVICE LIKE ('%MEMBER%') )))) Das geht so nicht ... eine kleine Hilfe?

Manfred
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#6

Re: SQL Optimierung / Erweiterung

  Alt 6. Feb 2010, 16:10
Hallo,

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

WHERE S.SERVICE_NAME LIKE '%MEMBER%'
Heiko
Heiko
  Mit Zitat antworten Zitat
manfred_h

Registriert seit: 4. Nov 2005
Ort: Basel
442 Beiträge
 
Delphi XE2 Enterprise
 
#7

Re: SQL Optimierung / Erweiterung

  Alt 6. Feb 2010, 17:16
Zitat von hoika:
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 WHERE S.SERVICE_NAME =(SERVICE LIKE ('%MEMBER%') )))) ausgedacht. Leider noch ohne Erfolg.
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#8

Re: SQL Optimierung / Erweiterung

  Alt 6. Feb 2010, 17:41
Vielleicht so...
SQL-Code:
WHERE SERVICE LIKE '%MEMBER%'
  AND SERVICE_NAME LIKE '%' + SERVICE + '%'
  Mit Zitat antworten Zitat
manfred_h

Registriert seit: 4. Nov 2005
Ort: Basel
442 Beiträge
 
Delphi XE2 Enterprise
 
#9

Re: SQL Optimierung / Erweiterung

  Alt 6. Feb 2010, 18:05
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. WHERE S.SERVICE_NAME AND SERVICE LIKE '%MEMBER%' ))) will er auch nicht, und auch das nicht
 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 ('MEMBERIN (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 ('MEMBERIN (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)))
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#10

Re: SQL Optimierung / Erweiterung

  Alt 6. Feb 2010, 20:36
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 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 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 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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:28 Uhr.
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