Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Denkfehler bei SQL SELECT Abrage (https://www.delphipraxis.net/194119-denkfehler-bei-sql-select-abrage.html)

Fridolin622 19. Okt 2017 10:00

Datenbank: MySQL • Version: 5.22 • Zugriff über: FireDAC

Denkfehler bei SQL SELECT Abrage
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo zusammen,

da ich scheinbar grad zu blöde bin, eine einfache Tabelle in diesem Beitrag zu erzeugen, habe ich mein Anliegen in einer PDF Datei angehangen.

Ich bitte um Verzeihung :oops: und hoffe, dass Ihr trotzdem bereit seid mir zu helfen. Vielen Dank im Voraus.

Gruß,
Fridolin

jobo 19. Okt 2017 10:07

AW: Denkfehler bei SQL SELECT Abrage
 
Was bedeutet denn "wenn ich nur nach einem Eintrag suche"
Wenn Du nur ein Kriterium angibst?
Oder wenn Du mehr als ein Ergebnis erwartest?

Die naheliegendste Antwort ist ja, dass bestimmte Kombinationen nicht vorhanden sind.
Was Du in deinem BeispielSQL machst, ist allerdings nicht möglich
where kriterium =1 and kriterium =2
wird nie ein Ergebnis liefern
Das muss mit OR als alternatives (Set von) Kriterien abgefragt werden.


P.S: Wenigstens die Fragestellung selbst im Post selbst zu veröffentlichen, erhöht sicher die Chance auf Antworten. Da viele nicht gerne solche Downloads runterladen und öffen (PDF ist aber ja noch ein recht freundliches Format)

Devil1925 19. Okt 2017 10:17

AW: Denkfehler bei SQL SELECT Abrage
 
Du Suchst in deinem SQL
SQL-Code:
SELECT mitarbeiter.name FROM
mitarbeiter, zuordnung WHERE
mitarbeiter.ID = zuordnung.MitarbeiterID AND
((zuordnung.QualifikationsID = 1 AND zuordnung.Auspraegung >= 1) AND
(zuordnung.QualifikationsID = 2 AND zuordnung.Auspraegung >= 3))
Nach einem Mitarbeiter, welcher (QualifikationsID 1 und Auspraegung >= 1) hat. Desweiteren Fragst du auch noch ab ob dieser Mitarbeiter (QualifikationsID 2 und Auspraegung >=3) hat durch das AND hinter der ersten Klammer. Ein Datensatz kann aber in einem Feld (QualifikationsID) nicht gleichzeitig 1 und 2 stehen haben. Hierdurch ist das ergebnis immer 0. wenn du das AND hinter der ersten Klammer durch ein OR ersetzt, ist die Frage nach einem Mitarbeiter mit (QualifikationsID 1 und Auspraegung >= 1) oder (QualifikationsID 2 und Auspraegung >=3). Das dürfte das Gewünschte ergebnis liefern.
SQL-Code:
SELECT mitarbeiter.name FROM
mitarbeiter, zuordnung WHERE
mitarbeiter.ID = zuordnung.MitarbeiterID AND
((zuordnung.QualifikationsID = 1 AND zuordnung.Auspraegung >= 1) OR
(zuordnung.QualifikationsID = 2 AND zuordnung.Auspraegung >= 3))

rapante 19. Okt 2017 10:27

AW: Denkfehler bei SQL SELECT Abrage
 
Zitat:

Zitat von Devil1925 (Beitrag 1383642)
Das dürfte das Gewünschte ergebnis liefern.
SQL-Code:
SELECT mitarbeiter.name FROM
mitarbeiter, zuordnung WHERE
mitarbeiter.ID = zuordnung.MitarbeiterID AND
((zuordnung.QualifikationsID = 1 AND zuordnung.Auspraegung >= 1) OR
(zuordnung.QualifikationsID = 2 AND zuordnung.Auspraegung >= 3))

Nein. Er sucht ja nach einem Mitarbeiter der BEIDE Kriterien erfüllt.

Ich würde es über Subselects lösen:
SQL-Code:
SELECT mitarbeiter.name
FROM mitarbeiter
WHERE
mitarbeiter.ID in (SELECT mitarbeiterid FROM zuordnung WHERE zuordnung.QualifikationsID = 1 AND zuordnung.Auspraegung >= 1) AND
mitarbeiter.ID in (SELECT mitarbeiterid FROM zuordnung WHERE zuordnung.QualifikationsID = 2 AND zuordnung.Auspraegung >= 3)
[/QUOTE]

Das geht wahrscheinlich auch noch eleganter...

joachimd 19. Okt 2017 10:36

AW: Denkfehler bei SQL SELECT Abrage
 
Struktur:
Code:
create table Mitarbeiter(ID integer, PersNr integer, Name cichar(20), Vorname cichar(20));
insert into mitarbeiter values
 (1, 15, 'Müller', 'Karl'),
 (2, 67, 'Mayer', 'Heinz'),
 (3, 85, 'Schulze', 'Max'),
 (4, 12, 'Schmidt', 'Moritz');
 
create table Qualifikationen(ID integer, Bezeichnung cichar(20));
insert into Qualifikationen values
 (1, 'Hydraulik'),
 (2, 'Pneumatik'),
 (3, 'Elektrik');
 

create table Zuordnung( MitarbeiterID integer, QualifikationsID integer, Auspraegung integer);
insert into zuordnung values
 (2,3,3),
 (3,1,2),
 (3,2,3),
 (4,1,1),
 (4,2,1),
 (4,3,1);
Abfrage erfolgt über ein zusätzliches join pro geforderter Qualifikation:
Code:
select m.* from mitarbeiter m
inner join zuordnung z1 on z1.mitarbeiterid=m.id
inner join zuordnung z2 on z2.mitarbeiterid=m.id
where (z1.qualifikationsid=1 and z1.auspraegung>=1)
and (z2.qualifikationsid=2 and z2.auspraegung>=3)

DeddyH 19. Okt 2017 10:37

AW: Denkfehler bei SQL SELECT Abrage
 
My 2 Cents:
SQL-Code:
SELECT
  M.Name
FROM
  Mitarbeiter M
  JOIN Zuordnung Z1 ON Z1.MitarbeiterID = M.ID AND Z1.QualifikationsID = 1 AND Z1.Auspraegung >= 3
  JOIN Zuordnung Z2 ON Z2.MitarbeiterID = M.ID AND Z2.QualifikationsID = 2 AND Z2.Auspraegung >= 3
Ungetestet

Fridolin622 19. Okt 2017 16:00

AW: Denkfehler bei SQL SELECT Abrage
 
Ich möchte euch recht herzlich danken. Ich habe die Lösung von DaddyH gewählt. Funktioniert tadellos.

Vielen Dank nochmal.

Gruß,
Fridolin


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:46 Uhr.

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