Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Schwierige SQL-Abfrage, oder wie muss ich joinen (left...)? (https://www.delphipraxis.net/91834-schwierige-sql-abfrage-oder-wie-muss-ich-joinen-left.html)

stifflersmom 10. Mai 2007 15:37

Datenbank: ABS • Version: 5.13 • Zugriff über: ABS Komponenten

Schwierige SQL-Abfrage, oder wie muss ich joinen (left...)?
 
Ok, die Überschrift ist nicht prickelnd..
Nun mein Problem
Ich habe drei Tabellen:

WORDS
---------------------
WORD_ID INTEGER
WORD VARCHAR
1 der
2 eine
3 niemand
4 peter

DOCUMENT_WORDS
---------------------
DOCUMENT_WORD_ID INTEGER
WORD_ID INTEGER
DOCUMENT_ID INTEGER
1 1 1
2 3 1
3 4 1
4 2 2
4 1 2


DOCUMENTS
---------------------
DOCUMENT_ID INTEGER
DOCUMENT_NAME VARCHAR
1 Diplom1.doc
2 Putzplan.doc
3 Tagebuuch.doc

Wie muss ich jetzt meine Select-Anweisung formulieren,
um die Dokumente anzeigen zu lassen, in denen ALLE Wörter
vorkommen, die meiner Suchanfrage entsprechen?

Als Beispiel will ich jetzt die Dokumente aufgelistet haben,
in denen die Wörter "der" und "eine" vorkommen.
Richtig gut wäre es, wenn ich hier noch formulieren könnte,
welche Wörter NICHT in einem Dokument enthalten sein dürfen.

Ich breche mir hier mit den ganzen left inner... Join-Möglichkeiten die
Finger ab, und komme zu keinem vernünftigen Ergebnis.

Moin

hoika 10. Mai 2007 15:50

Re: Schwierige SQL-Abfrage, oder wie muss ich joinen (left..
 
Hallo,

select distinct(DOCUMENT_NAME )

from DOCUMENTS
join DOCUMENT_WORDS.DOCUMENT_ID = DOCUMENTS.DOCUMENT_ID
join WORDS on WORDS.WORD.ID= DOCUMENT_WORDS.WORD_ID

where (WORDS.WORD='der') or (WORDS.WORD='eine')


zum nicht vorhanden würde ich nen subselect nehmen
siehe meine Posting heute zu "delete mit join"


Heiko

stifflersmom 10. Mai 2007 18:19

Re: Schwierige SQL-Abfrage, oder wie muss ich joinen (left..
 
Tja, die Suche ist auf jeden Fall gelöst:
SQL-Code:
select d.document_name, d.document_id, w.word
from documents as d, document_words as dw
left join words as w on dw.word_id=w.word_id

where d.document_id=dw.document_id
and (w.word='der' or w.word='eine')
Jetzt fehlt nur noch die Ausschlussbedingung.

omata 10. Mai 2007 19:28

Re: Schwierige SQL-Abfrage, oder wie muss ich joinen (left..
 
Hallo stifflersmom,

hier mal mein Vorschlag...

SQL-Code:
SELECT d.document_name, d.document_id, w.word
FROM documents d
INNER JOIN document_words dw
  ON d.document_id = dw.document_id
LEFT JOIN words w
  ON dw.word_id = w.word_id
WHERE w.word    IN ('der', 'eine')
  AND w.word NOT IN ('die', 'das')
Gruss
Thorsten

stifflersmom 11. Mai 2007 13:05

Re: Schwierige SQL-Abfrage, oder wie muss ich joinen (left..
 
Zitat:

Zitat von omata
Hallo stifflersmom,

hier mal mein Vorschlag...

SQL-Code:
SELECT d.document_name, d.document_id, w.word
FROM documents d
INNER JOIN document_words dw
  ON d.document_id = dw.document_id
LEFT JOIN words w
  ON dw.word_id = w.word_id
WHERE w.word    IN ('der', 'eine')
  AND w.word NOT IN ('die', 'das')
Gruss
Thorsten

Nein, die Ausschlussbedingung funktioniert leider nicht

Phoenix 11. Mai 2007 13:32

Re: Schwierige SQL-Abfrage, oder wie muss ich joinen (left..
 
Aufbauend auf dem Vorschlag oben:
SQL-Code:
SELECT d.document_name, d.document_id, w.word
FROM documents d
INNER JOIN document_words dw
  ON d.document_id = dw.document_id
LEFT JOIN words w
  ON dw.word_id = w.word_id
WHERE w.word    IN ('der', 'eine')
AND dw.word_id NOT IN (SELECT word_id FROM words WHERE word IN ('die', 'das'))

Angel4585 11. Mai 2007 13:42

Re: Schwierige SQL-Abfrage, oder wie muss ich joinen (left..
 
SQL-Code:
SELECT d.document_name, d.document_id, w.word
FROM documents d
INNER JOIN document_words dw
  ON d.document_id = dw.document_id
LEFT JOIN words w
  ON dw.word_id = w.word_id
WHERE    (w.word IN ('der', 'eine'))
  AND NOT (w.word IN ('die', 'das'))
das muss eigentlich gehen :gruebel:

stifflersmom 11. Mai 2007 13:42

Re: Schwierige SQL-Abfrage, oder wie muss ich joinen (left..
 
Zitat:

Zitat von Phoenix
Aufbauend auf dem Vorschlag oben:
SQL-Code:
SELECT d.document_name, d.document_id, w.word
FROM documents d
INNER JOIN document_words dw
  ON d.document_id = dw.document_id
LEFT JOIN words w
  ON dw.word_id = w.word_id
WHERE w.word    IN ('der', 'eine')
AND dw.word_id NOT IN (SELECT word_id FROM words WHERE word IN ('die', 'das'))

Nein, funktioniert leider auch nicht

Angel4585 11. Mai 2007 13:44

Re: Schwierige SQL-Abfrage, oder wie muss ich joinen (left..
 
es kommen doch sicher Fehlermeldungen wenn du die Abfragen ausführst, kannst du die mal dazuposten wenn was nciht funktioniert?

stifflersmom 11. Mai 2007 13:44

Re: Schwierige SQL-Abfrage, oder wie muss ich joinen (left..
 
Zitat:

Zitat von stifflersmom
Tja, die Suche ist auf jeden Fall gelöst:
SQL-Code:
select d.document_name, d.document_id, w.word
from documents as d, document_words as dw
left join words as w on dw.word_id=w.word_id

where d.document_id=dw.document_id
and (w.word='der' or w.word='eine')
Jetzt fehlt nur noch die Ausschlussbedingung.

Und da habe ich mich auch zu früh gefreut,
denn es wedren alle Dokumente gefunden in denen
entweder das eine oder das andere Wort vorkommt,
nicht aber das was eigentlich soll, nämlich das,
in dem beide Wörter zu finden sind.

stifflersmom 11. Mai 2007 13:45

Re: Schwierige SQL-Abfrage, oder wie muss ich joinen (left..
 
Zitat:

Zitat von Angel4585
es kommen doch sicher Fehlermeldungen wenn du die Abfragen ausführst, kannst du die mal dazuposten wenn was nciht funktioniert?

nein, Fehlermeldung gibt es keine,
nur das Ergebnis ist nicht so wie gewünscht.

Phoenix 11. Mai 2007 13:57

Re: Schwierige SQL-Abfrage, oder wie muss ich joinen (left..
 
dann mach doch mal aus dem OR ein AND...
und dann noch meine Ausschlussbedingung dazu, das sollte dann passen.

Angel4585 11. Mai 2007 14:02

Re: Schwierige SQL-Abfrage, oder wie muss ich joinen (left..
 
Zitat:

Zitat von Phoenix
dann mach doch mal aus dem OR ein AND...

aber ein word kann nicht gleichzeitig zwei werte haben ;)

stifflersmom 11. Mai 2007 14:04

Re: Schwierige SQL-Abfrage, oder wie muss ich joinen (left..
 
Zitat:

Zitat von Phoenix
dann mach doch mal aus dem OR ein AND...
und dann noch meine Ausschlussbedingung dazu, das sollte dann passen.

Das ist ja ein teil des Problems,
mache ich aus dem OR ein AND, dann kommt
gar kein Ergebnis mehr raus.
Jedenfalls nicht mit den Abfragen, wie sie bis
jetzt hier stehen.

mquadrat 11. Mai 2007 14:29

Re: Schwierige SQL-Abfrage, oder wie muss ich joinen (left..
 
Erster Gedanke (keinen Schimmer, ob die Laufzeit erträglich ist)

SQL-Code:
select d.document_name, d.document_id
from documents as d
  join document_words as dw on d.document_id = dw.document_id
  join words join words as w on dw.word_id = w.word_id
where
  w.word='der' or
  w.word='eine'
group by d.document_name, d.document_id
having count(*) = 2
Die Zahl muss halt gleich der Anzahl der gesuchten Worte sein. Die Query gibt alle gefunden Kombinationen zurück und das having schmeißt alle Dokumente raus, die nur einen Teil der Wörter enthalten.

Angel4585 11. Mai 2007 14:38

Re: Schwierige SQL-Abfrage, oder wie muss ich joinen (left..
 
SQL-Code:

select d.document_name, d.document_id from documents as d
where
(select count(*) from document_words as dw left outer join words as w on dw.word_id=w.word_id
 where (d.document_id=dw.document_id)and(w.word="der" or w.word="eine"))>="2"
so vielleicht?

ich gehe dabei davon aus das nich zweimal das Wort "eine" bei document 1 ist, sondern jedes Wort pro Dokument nur einmal aufgeführt wird

stifflersmom 11. Mai 2007 16:37

Re: Schwierige SQL-Abfrage, oder wie muss ich joinen (left..
 
Zitat:

Zitat von mquadrat
Erster Gedanke (keinen Schimmer, ob die Laufzeit erträglich ist)

SQL-Code:
select d.document_name, d.document_id
from documents as d
  join document_words as dw on d.document_id = dw.document_id
  join words join words as w on dw.word_id = w.word_id
where
  w.word='der' or
  w.word='eine'
group by d.document_name, d.document_id
having count(*) = 2
Die Zahl muss halt gleich der Anzahl der gesuchten Worte sein. Die Query gibt alle gefunden Kombinationen zurück und das having schmeißt alle Dokumente raus, die nur einen Teil der Wörter enthalten.

ein Join Words Zuviel,
aber funktioniert soweit,
fehlt nur noch die Ausschlussbedingung zu meinem Glück

stifflersmom 11. Mai 2007 16:42

Re: Schwierige SQL-Abfrage, oder wie muss ich joinen (left..
 
Zitat:

Zitat von Angel4585
SQL-Code:

select d.document_name, d.document_id from documents as d
where
(select count(*) from document_words as dw left outer join words as w on dw.word_id=w.word_id
 where (d.document_id=dw.document_id)and(w.word="der" or w.word="eine"))>="2"
so vielleicht?

ich gehe dabei davon aus das nich zweimal das Wort "eine" bei document 1 ist, sondern jedes Wort pro Dokument nur einmal aufgeführt wird

Ja, funktioniert und es ist tatsächlich so, dass ein Wort immer nur einmal pro Dokument zugeordnet wird.
Allerdings fehlt auch hier zu meinem vollkommenen Glück, die Ausschlussbedingung.


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:48 Uhr.

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