AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Denkfehler bei SQL SELECT Abrage
Thema durchsuchen
Ansicht
Themen-Optionen

Denkfehler bei SQL SELECT Abrage

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

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

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
172 Beiträge
 
Delphi 12 Athens
 
#2

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...
Micha
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.659 Beiträge
 
Delphi 12 Athens
 
#3

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
Benutzerbild von joachimd
joachimd

Registriert seit: 17. Feb 2005
Ort: Weitingen
684 Beiträge
 
Delphi 12 Athens
 
#4

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
Antwort Antwort


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 05:48 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