Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Mit JOIN suchen über merhere Tabellen...klappt nicht (https://www.delphipraxis.net/145452-mit-join-suchen-ueber-merhere-tabellen-klappt-nicht.html)

tdeck 1. Jan 2010 23:18

Datenbank: MSSQL • Version: 2005 • Zugriff über: TADOQUERY

Mit JOIN suchen über merhere Tabellen...klappt nicht
 
Hallo Leute.

Leider habe ich hier mal wieder ein SQL-Abfrage Problem. Ich muss eine SQL-Script in Delphi erzeugen, das über mehrere Tabellen einer Datenbank, Sclüsselwörter sucht.

Ich dachte mir ich erzeuge einfach eine VirtuelleTabelle mit den JOIN Befehl und suche dann darin die Daten.

SQL-Code:
SELECT *
from
dbo.VORGANG v
join dbo.VORGADR va on va.ROWVORGANG = v.ROWVORGANG
left OUTER join dbo.PROJEKTORDNER po on (po.OBJEKTNR = v.ROWVORGANG AND po.OBJEKTKZ = 'VOR')
join dbo.PROJEKTE p on p.ROWPROJEKT = po.ROWPROJEKT

Hier mal die wichtigsten Tabellen Aufbauten:

Tabelle VORGANG:
ROWID
ROWVORGANG
...

Tabelle VORGADR:
ROWID
ROWVORGANG
...

Tabelle PROJEKTORDNER:
ROWID
ROWPROJEKT
OBJEKTKZ
OBJEKTNR
...

Tabelle PROJEKTE
ROWID
ROWPROJEKT
...

Problem der Datenbank-Struktur:
VORGANG und VORGADR gibt es immer, beide haben das Feld ROWVORGANG, hier gibt es auch keine Probleme.
Aber nicht jeder Vorgang ist auch im Projekt eingetragen, dies steht in der Tabelle PROJEKTORDNER,
dort darf ich aber nur die OBJEKTKZ='VOR' zuordnen. Wenn das OBJEKTKZ='VOR' ist, dann ist die OBJEKTNR = ROWVORGANG

Ziel war eigentlich, das er die Tabellen JOINT und die Felder die eben nicht im PROJEKTORDNER eingetragen und nicht OBJEKTKZ='VOR' sind einfach leer lässt. Und ich dann einfach über alle wichtigen Felder meine WHERE Anweisung ausführen kann.

Aber leider bewirkt meine Anweisung, das alle Einträge aus VORGANG die nicht mit den PROJEKTORDNER oder OBJEKTKZ='VOR' übereinstimmen aus der virtuellen Tabelle entfernt werden.

Ist JOIN die richtige Wahl dafür? Oder habe ich hier einen Grundsätzlichen Denkfehler?
Ich hoffe ihr habt einen Tip für mich, ich teste schon seit Stunden rum und finde keine richtige Lösung.

Gruss
Thorsten

scrat1979 2. Jan 2010 06:38

Re: Mit JOIN suchen über merhere Tabellen...klappt nicht
 
Aus meiner Linksammlung: SQL-Referenz

SCRaT

alzaimar 2. Jan 2010 09:19

Re: Mit JOIN suchen über merhere Tabellen...klappt nicht
 
Dadurch, das Du VORGANG mit PROJEKT per JOIN verknüpfst, eliminierst du deine fehlenden Kandidaten. Verwende auch hier ein LEFT JOIN.

Hier was zum Merken:

Zwei Tabellen: Paare (also: Eltern) und Kinder. Es gibt kinderlose Paare, Paare mit Kindern und Waisenkinder.
1. Alle Paare und falls sie Kinder haben auch Diese: SELECT * FROM Paare LEFT JOIN Kinder
2. Nur Paare mit Kindern: ... Paare JOIN Kinder
3. Alle Kinder und falls sie Eltern haben auch Diese: ... Paare RIGHT JOIN Kinder
4. Nur Paare ohne Kinder: ... Paare LEFT JOIN Kinder WHERE Kinder.Kind IS NULL
5. Nur Waisenkinder: ... Paare RIGHT JOIN Kinder WHERE Paare.Paar IS NULL

(Die ON - Klausel (Paare JOIN Kinder ON Paar.paarID = Kinder.paarID) habe ich weggelassen.
Anmerkungen:
A LEFT JOIN B ist das Gleiche wie B RIGHT JOIN A
(2) kann man auch so ausdrücken: Paare LEFT JOIN Kinder WHERE Kinder.Kind is not null. Auf Deutsch bedeutet das:
"Alle Paare, und falls sie Kinder haben, auch Diese WOBEI es ein Kind geben muss"

tdeck 3. Jan 2010 22:49

Re: Mit JOIN suchen über merhere Tabellen...klappt nicht
 
Hallo Leute!
Vielen Dank für die Hilfe (immer wieder gute in der Delphi-Praxis ;) )

Das mit dem "LEFT JOIN" war das ganze Problem, was mir aber jetzt bei größeren Datenmengen auffällt, das
der Zugriff so einfach zu langsam ist und ich habe noch nichtmal alle Suchfelder der virtuellen Tabelle drinnen, die ich brauche.

SQL-Code:
SELECT *
from
dbo.VORGANG v
join dbo.VORGADR va on va.ROWVORGANG = v.ROWVORGANG
left join dbo.PROJEKTORDNER po on (po.OBJEKTNR = v.ROWVORGANG AND po.OBJEKTKZ = 'VOR')
left join dbo.PROJEKTE p on p.ROWPROJEKT = po.ROWPROJEKT

WHERE v.BELEGART = 'TR'
AND (
UPPER(v.VORGANGNR) LIKE '%'+UPPER('FR')+'%'
OR UPPER(v.BETREFF) LIKE '%'+UPPER('FR')+'%'
OR UPPER(v.FREMDEAUFTNR) LIKE '%'+UPPER('FR')+'%'
OR UPPER(v.FREMDEKOMNR) LIKE '%'+UPPER('FR')+'%'
)
Meine Standard-Suchfunktion (über Delphi) reagiert auf jeden Tastendruck und soll dann gleich das ganze Ergebnis liefern, bei einer Tabelle war das bis jetzt kein Problem, aber jetzt braucht er immer alleine schon einen Moment die JOIN's zu machen.

Frage:
Muss ich die JOIN's überhaubt jedesmal bei einer Suchtextänderung ausführen, oder reicht das ganze einmal und danach nur den Teil ab dem "WHERE...". Gibt es evtl. eine einfache SQL-Abfrage, die prüft ob die Virtuelle-Tabelle noch aktuell und vorhanden ist, und wenn ja diesen Teil einfach überspringt?

Gruß
Thorsten

Sir Rufo 4. Jan 2010 00:25

Re: Mit JOIN suchen über merhere Tabellen...klappt nicht
 
1. Du könntest mit einer View arbeiten, da kann der SQL-Server ein wenig mehr optimieren
2. Du solltest nicht direkt nach jedem Tastendruck suchen

- Suche erst ab 3 eingegebenen Zeichen starten
- nach jedem Tastendruck einen Timer starten und erst nach Ablauf des Timers (z.B. 500ms) die Suche ausführen

Dadurch kann der Benutzer den Suchbegriff sehr flüssig eingeben und erst dann wird gesucht.

hoika 4. Jan 2010 07:09

Re: Mit JOIN suchen über merhere Tabellen...klappt nicht
 
Hallo,

benutze eine Stored Procedure.

Schreibe die Suchanfragen dort direkt ohne joins,
etwa so

Select X From Table_1
Where Table_1.Field_1='bla'
Into :Param_1;
if :Param_1 is not NULL
Suspend;

Select X From Table_2
Where Table_2.Field_1='bla'
Into :Param_2;
if :Param_2 is not NULL
Suspend;


Die Return-Parameter kannst du nat. su bauen, wie du es brauchst.

Alternative wäre auch noch eine UNION.


Heiko


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:12 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