Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

SQL-Befehl gesucht

4 views
Skip to first unread message

Heiko Wetteborn

unread,
Feb 23, 2021, 12:29:23 AM2/23/21
to
Hallo Leute,

Also ich habe dummerweise einen kleinen auftrag übernommen, ein bereits
begonnenes Projekt weiter zu entwickeln.
Der Auftraggeber möchte eine Art DMS für den Hausgebrauch erstellt haben.
Dabei soll zu jedem eingescannten Dokument die Möglichkeit bestehen, bis zu 16
Stichworte und zusätzlich ein Infotext zu speichern.

Mir scheint, der bisherige Entwickler hat vonSQL gar keine Ahnung.

Es gibt eine Datenbank mit zwei Tabellen, die folgende Struktur aufweisen:

Tabelle 1:
ID: fortlaufende Nummerierung, Autoinkrement
Datum: VChar, 15-Stellig, UTF-8
Datei: Char, 250-Stellig, UTF-8
Blatt: INT, 5-stellig, UTF-8
info: Schar: 4096-stellig, UTF-8

Tabelle 2:
Begriff: Schar, 128-stellig, UTF-8
page: INT, 5-Stellig, UTF-8

Erstmal ist mir aufgefallen, dass nirgendwo ein Index gesetzt wurde. :-(

In den Tabellenzellen tabelle1.blatt und tabelle2.page steht der selbe Wert,
so dass ich hier eine mögliche Verknüpfung der beiden Tabellen versuchen
würde.

In der bereits von meinem Vorgänger erstellten Suchmaske kann wie folgt
gesucht werden:

1. Suche nach Stichwort
Bei dieser Suche wird in der Tabelle 2 nach dem entsprechenden Begriff
gesucht

2. Suche nach Teilen des Infotextes
Bei dieser Suche wird via LIKE oder NOT LIKE in der Tabelle 1 im Feld Info
gesucht.

Beide Suchvarianten sind mit UND oder ODER verknüpfbar.

Suche ich nun im Feld Stichwort nach einem Begriff, werden mir alle
Suchergebnisse ausgegeben, die in der Tabelle 2 enthalten sind.
Suche ich einen Teil im Infotext, werden mir aus der Tabelle 1 alle
entsprechenden Suchergebnisse ausgegeben.

Gebe ich nun sowohl in Feld Stichwort einen Begriff ein als auch imm Suchfeld
Infotext, erhalte ich Suchergebnisse doppelt.

Das liegt daran, dass im Quelltext zuerst mittels SQL die Abfrage
SELECT begriff, page FROM tabelle2 WHERE begriff='Suchbegriff' ausgeführt und
tabellarisch ausgegeben wird,
und danach erst mit einer weiteren SQL-Abfrage der Befehl
SELECT * FROM tabelle1 WHERE info LIKE 'infotext'
ausgeführt und tabellarisch ausgegeben wird.

Nun bin ich mir aber verdammt sicher, dass beide SQL-Befehle zusammengefasst
werden können, um unnötige Datenbankzugriffe zu vermeiden.

Also ungefähr so:

SELECT begriff, page FROM Tabelle2 WHERE begriff='Suchbegriff' AND IN tabelle1
infoLIKE 'infotext'

Irgendwie komme ich hier aber nicht auf den richtigen Weg. Mir war aus meiner
Erinnerung heraus so, dass wohl JOIN eine Hilfe sein kann. Aber wie?

Der SQL-Befehl

SELECT tabelle1.datei, tabelle1.datum, tabelle2.begriff, tabelle2.page FROM
tabelle1, tabelle2 WHERE begriff = 'Rechnung'

gibt mir bei einem derzeitigen Datenbestand von 50 Datensätzen 275
Suchergebnisse aus.
Ich stand mit JOIN schon immer auf dem Kriegsfuß. ;-)
Gruß
Heiko


Tim Ritberg

unread,
Feb 23, 2021, 6:50:34 AM2/23/21
to
Am 23.02.21 um 06:29 schrieb Heiko Wetteborn:
Es gibt auch noch Sub-SELECT.

Tim

Peter J. Holzer

unread,
Feb 25, 2021, 2:39:35 PM2/25/21
to
On 2021-02-23 05:29, Heiko Wetteborn <heik...@gmail.com> wrote:
> Also ich habe dummerweise einen kleinen auftrag übernommen, ein bereits
> begonnenes Projekt weiter zu entwickeln.
> Der Auftraggeber möchte eine Art DMS für den Hausgebrauch erstellt haben.
> Dabei soll zu jedem eingescannten Dokument die Möglichkeit bestehen, bis zu 16
> Stichworte und zusätzlich ein Infotext zu speichern.
>
> Mir scheint, der bisherige Entwickler hat vonSQL gar keine Ahnung.
>
> Es gibt eine Datenbank mit zwei Tabellen, die folgende Struktur aufweisen:
>
> Tabelle 1:
> ID: fortlaufende Nummerierung, Autoinkrement
> Datum: VChar, 15-Stellig, UTF-8
> Datei: Char, 250-Stellig, UTF-8

Ihh! ;-)

> Blatt: INT, 5-stellig, UTF-8
> info: Schar: 4096-stellig, UTF-8
>
> Tabelle 2:
> Begriff: Schar, 128-stellig, UTF-8
> page: INT, 5-Stellig, UTF-8
>
> Erstmal ist mir aufgefallen, dass nirgendwo ein Index gesetzt wurde. :-(
>
> In den Tabellenzellen tabelle1.blatt und tabelle2.page steht der selbe Wert,
> so dass ich hier eine mögliche Verknüpfung der beiden Tabellen versuchen
> würde.
>
> In der bereits von meinem Vorgänger erstellten Suchmaske kann wie folgt
> gesucht werden:
>
> 1. Suche nach Stichwort
> Bei dieser Suche wird in der Tabelle 2 nach dem entsprechenden Begriff
> gesucht
>
> 2. Suche nach Teilen des Infotextes
> Bei dieser Suche wird via LIKE oder NOT LIKE in der Tabelle 1 im Feld Info
> gesucht.
[...]
> Irgendwie komme ich hier aber nicht auf den richtigen Weg. Mir war aus meiner
> Erinnerung heraus so, dass wohl JOIN eine Hilfe sein kann. Aber wie?
>
> Der SQL-Befehl
>
> SELECT tabelle1.datei, tabelle1.datum, tabelle2.begriff, tabelle2.page FROM
> tabelle1, tabelle2 WHERE begriff = 'Rechnung'
>
> gibt mir bei einem derzeitigen Datenbestand von 50 Datensätzen 275
> Suchergebnisse aus.
> Ich stand mit JOIN schon immer auf dem Kriegsfuß. ;-)

Du musst beim JOIN angeben, wie die beiden Tabellen miteinander
verbunden werden sollen:

SELECT tabelle1.datei, tabelle1.datum, tabelle2.begriff, tabelle2.page
FROM tabelle1 JOIN tabelle2 on tabelle1.Blatt = tabelle2.page
WHERE begriff = 'Rechnung';

Wenn Du das nicht machst, wird jede Zeile der ersten Tabelle mit jeder
Zeile der zweiten Tabelle verknüpft. Wenn jede Tabelle 1000 Zeilen hat,
hat das Ergebnis dann 1000000 Zeilen.

Das ist ist auch kein Malheur, denn Du kannst das nachher wieder über
eine WHERE-Klausel einschränken:

SELECT tabelle1.datei, tabelle1.datum, tabelle2.begriff, tabelle2.page
FROM tabelle1, tabelle2
WHERE begriff = 'Rechnung'
AND tabelle1.Blatt = tabelle2.page;

Das macht (in diesem einfachen Beispiel) genau das Gleiche, und der
Optimizer sollte auch in beiden Fällen den gleichen Plan produzieren.

hp
0 new messages