AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

sql für ganz harte

Offene Frage von "sancho1980"
Ein Thema von sancho1980 · begonnen am 10. Mai 2006 · letzter Beitrag vom 12. Mai 2006
Antwort Antwort
Seite 1 von 2  1 2      
sancho1980

Registriert seit: 7. Feb 2006
429 Beiträge
 
#1

sql für ganz harte

  Alt 10. Mai 2006, 22:32
Datenbank: firebird • Zugriff über: ibx, ibexpert
hallo
ich hab ein problem und weiß wieder mal nicht, wie ich es in sql ausdrúcken kann:
man stelle sich vor:

tabelle t1, folgendermaßen:

t1.f1: integer (fremdschlüssel auf andere tabelle)
t1.f2: integer (fremdschlüssel auf id von tabelle t2)

tabelle t2, folgendermaßen:

t2.id: integer
t2.wert: string;

bevor ich meine suchbedingung darlege, noch paar definition, sonst erklärt sich das schlecht:

IstGleich(t1,t2)..gibt mir eine liste von datensätzen zurück, dabei:
-ist jeder datensatz eine teilmenge von t2
-sind zwei oder mehr records in einem datensatz (Menge X) enthalten, dann heißt das, dass diejenigen einträge (Menge Y) aus t1, deren f2 auf die einträge von x verweisen, alle den gleichen wert f1 haben

Summe(L)..nimmt eine Liste L von Datensätzen entgegen und gibt mir eine Liste von Strings wieder
-der String[i] der ergebnisliste ist das ergebnis der des records r[i] der ausgansgsliste
-die Summe eines datensatzes ist die konkatenation des feldes 'wert' aller datensätze in dem datensatz sortiert nach dem feld 'id'

so, jetz brauch ich einen sql-query der über einen string s nach folgendem sucht:

alle werte für t1.f1, für die gilt:

Summe(IstGleich(t1,t2)) is like s

ich hab's versucht so akkurat wie möglich auszudrücken; hoffentlich versteht ihr was ich meine...
danke

martin
Um Rekursion zu verstehen, muss man zunächst Rekursion verstehen.
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#2

Re: sql für ganz harte

  Alt 11. Mai 2006, 00:45
Werde mal etwas konkreter, sonst wird das nicht. -> Beispiel
Gruß
Hansa
  Mit Zitat antworten Zitat
Benutzerbild von Kedariodakon
Kedariodakon

Registriert seit: 10. Sep 2004
Ort: Mönchengladbach
833 Beiträge
 
Delphi 7 Enterprise
 
#3

Re: sql für ganz harte

  Alt 11. Mai 2006, 00:56
Also ich hab mir das nun 5 mal durchgelesen und ich hab 0 verstanden...

Du solltest ein paar beispiel Daten posten, was nach den Funktionen rauskommt, was Genau X, Y und L ist schreiben und wo genau dein Problem ist und was du genau für das Beispiel für ein Ergebniss erwartest

Eventuell schon Code den du schon hast


Bye
Christian
  Mit Zitat antworten Zitat
sancho1980

Registriert seit: 7. Feb 2006
429 Beiträge
 
#4

Re: sql für ganz harte

  Alt 11. Mai 2006, 01:31
ok, angenommen, ich habe in meiner tabelle t1 folgende einträge (ich hatte im vorherigen post vergessen zu erwähnen, dass t1 auch noch ein feld 'id' hat)

f1 = 1, f2 = 2, id = 2
f1 = 1, f2 = 1, id = 1
f1 = 1, f2 = 3, id = 3
f1 = 2, f2 = 2, id = 5
f1 = 2, f2 = 1, id = 4
f1 = 3, f2 = 2, id = 6
f1 = 3, f2 = 3, id = 7

jetzt ein paar beispieleinträge für t2:

id = 1, wert = 'wie '
id = 2, wert = 'geht '
id = 3, wert = 'das?'

jetzt sei mein suchstring s = 'wie geht %'

als ergebnismenge müsste ich 2 datensätze bekommen, der erste hat das feld f1 = 1, der zweite hat f1 = 2...
warum?

schaut man sich die ersten drei einträge an, dann sieht man, dass sie zusammengehören, da sie den gleichen wert für f1 haben. daher lässt sich ein "kombinierter string" bilden (ich nenn das jetz mal so), und dieser kombinierte string ist 'wie geht das?' (die datensätze aus t1 müssen bei bildung dieses strings nach t1.id sortiert sein)...und 'wie geht das?' is like 'wie geht %'
daher kommt das entsprechende f1 in die ergebnismenge

dito für den vierten und fünften eintrag: sie haben beide den gleichen wert f1; ihr kombinierter string ist 'wie geht '
auch 'wie geht ' is like 'wie geht %' -> auch ihr wert für f1 (2) kommt in die ergebnismenge

beim sechsten und siebten eintrag (sie gehören zusammen, weil gleiche f1-werte) ist der kombinierte string aber 'geht das?
'geht das' is not like 'wie geht %' .. daher kommt 3 NICHT in die ergebnismenge...

isses jetz ein bisschen klarer was ich meine?

danke und gruß,

martin
Um Rekursion zu verstehen, muss man zunächst Rekursion verstehen.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#5

Re: sql für ganz harte

  Alt 11. Mai 2006, 06:20
Zitat:
jetzt sei mein suchstring s = 'wie geht %'

als ergebnismenge müsste ich 2 datensätze bekommen, der erste hat das feld f1 = 1, der zweite hat f1 = 2...
warum?
Nein weil dr Suchstring in keinen der Datensätzte vorhanden ist.
Markus Kinzler
  Mit Zitat antworten Zitat
Lemmy

Registriert seit: 8. Jun 2002
Ort: Berglen
2.381 Beiträge
 
Delphi 10.4 Sydney
 
#6

Re: sql für ganz harte

  Alt 11. Mai 2006, 08:04
Hi,

es könnte evtl. über eine SP funktionieren, aber nur weil man es machen kann, sollte man es nicht unbedingt machen. Letztenendes ist das nämlich eine sequentielle Suche innerhalb der DB (alle Datensätze müssen angefasst werden). Selbst wenn Du das in eine SP auslagerst, kostet das (eine gewisse Größe der DB vorausgesetzt) zu viel Zeit und Ressourcen.

Kannst Du das Design der DB nicht umgestalten? Was willst Du eigentlich erreichen?

Lemmy
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#7

Re: sql für ganz harte

  Alt 11. Mai 2006, 08:12
Ah.... ich verstehe.

SQL-Code:
Create View Words
as
select t1.f1, t2.wert
  from t1 join t2 on t1.f2 = t2.ID
Das liefert Dir eine Tabelle aller F1 mit den entsprechenden Werten.

Nun willst Du die F1, die die Wörter 'wie' und 'gehts' enthalten:
SQL-Code:
Select distinct w1.f1
  from Words w1
       join words w2 on w1.f1 = w2.f1
 where w1.wert = 'wie
   and w2.wert = 'gehts'
So oder ähnlich müsste es funktionieren. Damit das allgemeingültig wird, müsstest Du die zweite Anweisung dynamisch erzeugen:
Suche nach einem Wort:
SQL-Code:
Select distinct w1.f1
  from Words w1
where w1.Wert = 'wie'
Suche nach zwei Wörtern:
SQL-Code:
Select distinct w1.f1
  from Words w1
       join words w2 on w1.f1 = w2.f1
 where w1.wert = 'wie
   and w2.wert = 'gehts'
Nach drei Wörtern:
SQL-Code:
Select distinct w1.f1
  from Words w1
       join words w2 on w1.f1 = w2.f1
       join words w3 on w1.f1 = w3.f1
 where w1.wert = 'wie
   and w2.wert = 'gehts'
   and w3.wert = 'Foo'
Bestimmt geht das auch ohne die View und noch kürzer.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
sancho1980

Registriert seit: 7. Feb 2006
429 Beiträge
 
#8

Re: sql für ganz harte

  Alt 11. Mai 2006, 11:18
ihr habt mich leider noch nicht ganz verstanden:

der suchstring über den ich beispielsweise suche ist s = 'wie geht %'

nochmal meine einträge aus t1:

f1 = 1, f2 = 2, id = 2
f1 = 1, f2 = 1, id = 1
f1 = 1, f2 = 3, id = 3
f1 = 2, f2 = 2, id = 5
f1 = 2, f2 = 1, id = 4
f1 = 3, f2 = 2, id = 6
f1 = 3, f2 = 3, id = 7

und aus t2:

id = 1, wert = 'wie '
id = 2, wert = 'geht '
id = 3, wert = 'das?'

zuerst müsste t1 in teilmengen zerlegt werden, wobei für JEDE teilmenge T gilt, dass die einträge in T ALLE den gleichen wert f1 haben => in diesem beispiel müsste es 3 teilmengen geben; T1: eintrag 1-3, T2: eintrag 4-5, T3: eintrag 6-7..soweit klar, oder?

für jede teilmenge T müsste jetzt der sogenannte "kombinierte string" gebildet werden. dieser bildet sich wie folgt:

schritt 1: man sortiere die einträge aus T nach dem feld id
schritt 2: jetzt suche man zu jedem eintrag x aus T das entsprechende gegenstück y aus tabelle t2 und zwar über den fremdschlüssel t1.f2; die gesamtheit aller y sei T'; die einträge in T' werden NICHT neu sortiert, sondern sie BLEIBEN sortiert nach t1.id (siehe schritt 1)
schritt 3: man konkateniere die felder 'wert' aller einträge aus T'

=>der "kombinierte string" von T1 wäre 'wie geht das?', der von T2 'wie geht ' und der von T3 'geht das?'

=>für T1 und T2 trifft die suchbedingung also zu, da
-'wie geht das?' is like 'wie geht %'
und
-'wie geht ' is like 'wie geht'

DESWEGEN soll mir also der sql-query, den ich suche also die vereinigung von t1.f1 = 1 und t1.f1 = 2 zurückgeben

jetzt verstanden?

danke,

martin

Zitat:
Letztenendes ist das nämlich eine sequentielle Suche innerhalb der DB (alle Datensätze müssen angefasst werden).
Das hab ich mir gedacht, dass der Einwand kommt. Aber es handelt sich hierbei um einen Query der nur alle Jubeljahre mal ausgeführt werden soll, und da kann man auch mal ein bisschen warten

Zitat:
Was willst Du eigentlich erreichen?
Da müsste ich soweit ausholen, ich glaub da schlaft ihr ein.
Um Rekursion zu verstehen, muss man zunächst Rekursion verstehen.
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#9

Re: sql für ganz harte

  Alt 11. Mai 2006, 11:30
Das ist mir schon klar, aber vielleicht änderst du einfach deinen Suchstring, bzw. bastelst Dir eine kleine Funktion, die das macht. Meine Lösung dürfte jedenfalls funktionieren, wenn man die Frage (also den Suchstring) anders formuliert, nämlich: Ich suche alle F1, die mindestens "die in dieser Liste enthaltenen Wörter" enthalten:

Delphi-Quellcode:
Function CreateSQL (aWords : TStringList) : String;
Var
  sJoin,sWhere : String;

Begin
  sJoin := 'Words w1';
  sWhere := Format('w%d.wert = %s',[1,QuotedStr(aWords[0]]);
  For i:=1 to aWords.count - 1 do begin
    sJoin := sjoin + Format (' join words w%d on w%d = w%0:d.f1',[i,i-1]);
    sWhere := sWhere + Format('and w%d.wert = %s',[i+1,QuotedStr(aWords[i]]);
  End;
  Result := Format ('Select distinct w1.f1 from %s where %s',[sJoin, sWhere]);
End;
Diese Routine dürfte ungefähr die Abfrage so formulieren, wie ich es vorgeschlagen habe. Deine Aufgabe ist es nun, deinen Suchtext ('Wort1 Wort2 %') in eine Stringliste zu verwandeln. Wenn das '%' bedeutet soll, das die gesuchten F1 MINDESTENS diese Wörter enthalten muss, dann kannst musst Du noch den Fall behandeln, wenn man das '%' weglässt. Dann muss die Wortmenge je F1-Wert GENAU mit der Wortliste übereinstimmen.

Wenn die Reihenfolge der Wörter auch noch eine Rolle spielt, dann musst Du die Where-Klausel je Wort noch erweitern.

[edit] Nach mehrmaligem Durchlesen Deiner Anwort verstehe ich deine Kritik... Dir ist es lieber, die Wortliste je F1 in diesen String zu konkatenieren und DANN zu suchen, dann kann man den LIKE-Operator natürlich besser verwenden... DAS scheint nur mit einer stored Procedure zu gehen. Für den Fall, das du nur Übereinstimmungen einzelner Wörter suchst, ist meine Methode jedoch ausreichend.

Ach ja: Eine gute DB sollte niemals lange für eine Suche benötigen (Aggregate sind eine andere Sache)
[/edit]
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
sancho1980

Registriert seit: 7. Feb 2006
429 Beiträge
 
#10

Re: sql für ganz harte

  Alt 11. Mai 2006, 11:50
der suchstring kann aber vor der suche nicht zerlegt werden, weil du ja gar nicht weißt wie du ihn zerlegst

'wie geht %' kann zerlegt werden in:

'w' + 'ie geht %'

oder

'wie g' + 'eht %'

oder

'w' + 'ie geht %'

usw...
Um Rekursion zu verstehen, muss man zunächst Rekursion verstehen.
  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 17:59 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