AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Denkfehler bei SQL SELECT Abrage

Denkfehler bei SQL SELECT Abrage

Ein Thema von Fridolin622 · begonnen am 19. Okt 2017 · letzter Beitrag vom 19. Okt 2017
Antwort Antwort
Fridolin622

Registriert seit: 22. Nov 2010
4 Beiträge
 
#1

Denkfehler bei SQL SELECT Abrage

  Alt 19. Okt 2017, 10:00
Datenbank: MySQL • Version: 5.22 • Zugriff über: FireDAC
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 und hoffe, dass Ihr trotzdem bereit seid mir zu helfen. Vielen Dank im Voraus.

Gruß,
Fridolin
Angehängte Dateien
Dateityp: pdf SQL SELECT Denkfehler.pdf (30,4 KB, 25x aufgerufen)
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.040 Beiträge
 
Delphi 2010 Enterprise
 
#2

AW: Denkfehler bei SQL SELECT Abrage

  Alt 19. Okt 2017, 10:07
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)
Gruß, Jo
  Mit Zitat antworten Zitat
Benutzerbild von Devil1925
Devil1925

Registriert seit: 20. Nov 2015
Ort: Saerbeck
236 Beiträge
 
Delphi 10.3 Rio
 
#3

AW: Denkfehler bei SQL SELECT Abrage

  Alt 19. Okt 2017, 10:17
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))
Philipp
Höllische Grüße
Devil
Meistens sitzt das Problem vor dem Bildschirm! - Leider bin das oftmals ich.
  Mit Zitat antworten Zitat
Benutzerbild von rapante
rapante

Registriert seit: 3. Jun 2009
Ort: OPR
161 Beiträge
 
Delphi XE2 Professional
 
#4

AW: Denkfehler bei SQL SELECT Abrage

  Alt 19. Okt 2017, 10:27
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...
  Mit Zitat antworten Zitat
Benutzerbild von joachimd
joachimd

Registriert seit: 17. Feb 2005
Ort: Weitingen
639 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Denkfehler bei SQL SELECT Abrage

  Alt 19. Okt 2017, 10:36
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)
Joachim Dürr
Joachim Dürr Softwareengineering
http://www.jd-engineering.de
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.383 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Denkfehler bei SQL SELECT Abrage

  Alt 19. Okt 2017, 10:37
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
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Fridolin622

Registriert seit: 22. Nov 2010
4 Beiträge
 
#7

AW: Denkfehler bei SQL SELECT Abrage

  Alt 19. Okt 2017, 16:00
Ich möchte euch recht herzlich danken. Ich habe die Lösung von DaddyH gewählt. Funktioniert tadellos.

Vielen Dank nochmal.

Gruß,
Fridolin
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:54 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