![]() |
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 |
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) |
AW: Denkfehler bei SQL SELECT Abrage
Du Suchst in deinem SQL
SQL-Code:
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.
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))
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)) |
AW: Denkfehler bei SQL SELECT Abrage
Zitat:
Ich würde es über Subselects lösen:
SQL-Code:
[/QUOTE]
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) Das geht wahrscheinlich auch noch eleganter... |
AW: Denkfehler bei SQL SELECT Abrage
Struktur:
Code:
Abfrage erfolgt über ein zusätzliches join pro geforderter Qualifikation:
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);
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) |
AW: Denkfehler bei SQL SELECT Abrage
My 2 Cents:
SQL-Code:
Ungetestet
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 |
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 14:54 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