AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi SQL Syntax, Vergleich mit 2 Bedingungen
Thema durchsuchen
Ansicht
Themen-Optionen

SQL Syntax, Vergleich mit 2 Bedingungen

Ein Thema von haentschman · begonnen am 21. Jun 2008 · letzter Beitrag vom 21. Jun 2008
Antwort Antwort
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.388 Beiträge
 
Delphi 12 Athens
 
#1

SQL Syntax, Vergleich mit 2 Bedingungen

  Alt 21. Jun 2008, 11:47
Datenbank: firebird • Version: 2.0 • Zugriff über: Zeos
Hallo an alle SQL Experten...

ich versuche mich verständlich auszudrücken...was nicht einfach wird.
Mich interressiert ob nachfolgendes überhaupt möglich ist bzw. die Syntax eines solchen Ausdruckes.

Status 3 = Tätigkeit unerledigt (Status)
Verbrauch 1 = Verbrauchsmaterial ja (Status)

gegeben: (funktioniert wenn Edit12.Text eindeutig ist)
Delphi-Quellcode:
ZQueryFilter.SQL.Text:= 'select ANLAGE,BEZEICHNUNG,ART,QUALITAT,GROSSE,MENGE ';
ZQueryFilter.SQL.Add('from FILTEREINSATZ where VERBRAUCH = 1 and ANLAGE = (select ANLAGE from WARTUNGL where NUMMER = :Nummer) ');
ZQueryFilter.SQL.Add('and BEZEICHNUNG in (select BEZEICHNUNG from WARTUNGP where TATIGKEIT = :Tatigkeit and STATUS = 3 and NUMMER = :Nummer) ');
ZQueryFilter.SQL.Add('order by ANLAGE');
ZQueryFilter.ParamByName('Nummer').Value:= Edit12.Text;
ZQueryFilter.ParamByName('Tatigkeit').Value:= '3205 * Filtermedium wechseln';
ZQueryFilter.Open;
... durch die eindeutige Nummer erhalte ich die BEZEICHNUNG eindeutig (ähnlich distinct) da die Bezeichnung nur einmalig pro Anlage existiert und somit auch den Datensatz aus FILTEREINSATZ eindeutig.

...jetzt kommts

...ist Edit12.Text nicht eindeutig (z.B.leer) sollen alle Filter aller Anlagen geladen werden (ausgenommen Filter deren zugeordnete Tätigkeit erledigt ist.

...Syntaxfehler (einer mehrerer Versuche)
Delphi-Quellcode:
ZQueryFilter.SQL.Text:= 'select ANLAGE,BEZEICHNUNG,ART,QUALITAT,GROSSE,MENGE ';
ZQueryFilter.SQL.Add('from FILTEREINSATZ where VERBRAUCH = 1 ');
ZQueryFilter.SQL.Add('and BEZEICHNUNG,ANLAGE in (select A.BEZEICHNUNG,B.ANLAGE from A.WARTUNGP,B.WARTUNGL where A.TATIGKEIT = :Tatigkeit and A.STATUS = 3 and B.NUMMER = A.NUMMER) ');
ZQueryFilter.SQL.Add('order by ANLAGE');
ZQueryFilter.ParamByName('Tatigkeit').Value:= '3205 * Filtermedium wechseln';
ZQueryFilter.Open;
... da jetzt die Bezeichnungen mehrfach vorkommen können muß ich den "Vergleich" mit der Anlagennummer koppeln.
Vergleich mit 2 Feldern

im Prinzip dieser Part: and BEZEICHNUNG,ANLAGE

einfach mit and BEZEICHNUNG and ANLAGE geht nicht, da die Bezeichnung durch andere Anlagen identisch vorkommen kann und die Anlage sowieso. Eindeutig kann es nur sein, wenn ich beide in Verbindung betrachte.

...Nachfragen habt Ihr sowieso...

Danke für Eure Ideen.
  Mit Zitat antworten Zitat
NormanNG

Registriert seit: 1. Feb 2006
294 Beiträge
 
Delphi 2007 Professional
 
#2

Re: SQL Syntax, Vergleich mit 2 Bedingungen

  Alt 21. Jun 2008, 12:18
Hi,

versuch´s mal so
SQL-Code:
select ANLAGE,BEZEICHNUNG,ART,QUALITAT,GROSSE,MENGE
from FILTEREINSATZ f
join WARTUNGP A on A.TATIGKEIT = :Tatigkeit and A.STATUS = 3
join WARTUNGL B on and B.NUMMER = A.NUMMER
where f.VERBRAUCH = 1
and F.BEZEICHNUNG = A.Bezeichnung
and F.ANLAGE = B.ANLAGE
order by ANLAGE
getippt - nicht getestet

[edit, Code optimiert]
SQL-Code:
select ANLAGE,BEZEICHNUNG,ART,QUALITAT,GROSSE,MENGE
from FILTEREINSATZ f
join WARTUNGP A on A.STATUS = 3 and A.BEZEICHNUNG = F.Bezeichnung
join WARTUNGL B on B.NUMMER = A.NUMMER and F.ANLAGE = B.ANLAGE
where f.VERBRAUCH = 1 and A.TATIGKEIT = :Tatigkeit
order by ANLAGE
[/edit]
Gruß
Norman
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.388 Beiträge
 
Delphi 12 Athens
 
#3

Re: SQL Syntax, Vergleich mit 2 Bedingungen

  Alt 21. Jun 2008, 12:48
Danke für die schnelle Reaktion.

ich bekomme dann immer noch einen Filter angezeigt dessen Tätigkeit STATUS 0 hat.

zum Verständnis vieleicht noch folgendes:

Tabelle FILTEREINSATZ:
ANLAGE - Anlagennummer (z.B. ANL20081000)
BEZEICHNUNG - Bezeichnung des Filters (z.B. Rückluft)
GROSSE,MENGE,QUALITAT - Eigenschaften des Filters

...beim Anlegen einer Wartung
1. Wartung wird in Liste eingetragen
2. Bezeichnung des Filters wird in WARTUNGP angelegt (identisch mit aus Tabelle FILTEREINSATZ)

Tabelle WARTUNGL: (Liste der Wartungen)
NUMMER - Nummer der Wartung (z.B. WAR20081111)
ANLAGE - Anlagennummer

Tabelle WARTUNGP:
NUMMER - Nummer der Wartung (z.B. WAR20081111)
BEZEICHNUNG - Bezeichnung des Filters
-> Anlagennummer zur Wartung Nummer muß aus WARTUNGL geholt werden.


somit habe ich eigentlich alle Informationen welche benötigt werden.
Die Problematik liegt einfach darin den Datensatz eindeutig zu identifizieren, da ANLAGE / BEZEICHNUNG mehrfach vorkommen können und somit ein in im Statement ausfällt, da dann alle Kombinationen verwendet werden.

PS: Ich experementiere gerade mit UNION...scheint aber auch nicht der richtige Ansatz zu sein.
  Mit Zitat antworten Zitat
NormanNG

Registriert seit: 1. Feb 2006
294 Beiträge
 
Delphi 2007 Professional
 
#4

Re: SQL Syntax, Vergleich mit 2 Bedingungen

  Alt 21. Jun 2008, 12:58
Hi,

Zitat:
...ich bekomme dann immer noch einen Filter angezeigt dessen Tätigkeit STATUS 0 hat....
Dann nimm doch "Tätigkeit-Status<>0" in die Where-Bedingung mit auf
Gruß
Norman
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.388 Beiträge
 
Delphi 12 Athens
 
#5

Re: SQL Syntax, Vergleich mit 2 Bedingungen

  Alt 21. Jun 2008, 13:18
ich will ja nur die Eigenschaften der Filter sehen, welche bei der zugeordneten Tätigkeit den Status 3 haben.


Bsp:

Wartung 100 (entspricht Anlage 99) --> Rückluftfilter --> Tätigkeit erledigt (Status 3)
Wartung 100 (entspricht Anlage 99) --> Zuluftfilter --> Tätigkeit unerledigt (Status 0)

Wartung 101 (entspricht Anlage 100) --> Rückluftfilter --> Tätigkeit unerledigt (Status 0)
Wartung 101 (entspricht Anlage 100) --> Zuluftfilter --> Tätigkeit erledigt (Status 3)


Ergebnismenge soll sein aus Filtereinsatz:
Anlage 99, Rückluftfilter, Eigenschaften
Anlage 100, Zuluftfilter, Eigenschaften

Delphi-Quellcode:
ZQueryFilter.SQL.Text:= 'select ANLAGE,BEZEICHNUNG,ART,QUALITAT,GROSSE,MENGE ';
ZQueryFilter.SQL.Add('from FILTEREINSATZ where VERBRAUCH = 1 and ANLAGE in (select ANLAGE from WARTUNGL where NUMMER in (select NUMMER from WARTUNGP where TATIGKEIT = :Tatigkeit and STATUS = 3))');
ZQueryFilter.SQL.Add('and BEZEICHNUNG in (select BEZEICHNUNG from WARTUNGP where TATIGKEIT = :Tatigkeit and STATUS = 3 and NUMMER in (select NUMMER from WARTUNGP where TATIGKEIT = :Tatigkeit and STATUS = 3)) ');
ZQueryFilter.SQL.Add('order by ANLAGE');
ZQueryFilter.ParamByName('Tatigkeit').Value:= '3205 * Filtermedium wechseln';
ZQueryFilter.Open;
damit kriege ich logischerweise wieder alle Datensätze aus FILTEREINSATZ weil sowohl die Anlage durch
(select ANLAGE from WARTUNGL where NUMMER in (select NUMMER from WARTUNGP where TATIGKEIT = :Tatigkeit and STATUS = 3) als auch die Bezeichnung durch
(select BEZEICHNUNG from WARTUNGP where TATIGKEIT = :Tatigkeit and STATUS = 3 and NUMMER in (select NUMMER from WARTUNGP where TATIGKEIT = :Tatigkeit and STATUS = 3) vorhanden ist und über in alle Varianten möglich sind.

ich müßte ANLAGE und BEZEICHNUNG zusammen aus einem Subselect mit and mit den anderen Bedingungen verknüpfen (VERBRAUCH)

irgendwo habe ich einen Denkfehler
  Mit Zitat antworten Zitat
NormanNG

Registriert seit: 1. Feb 2006
294 Beiträge
 
Delphi 2007 Professional
 
#6

Re: SQL Syntax, Vergleich mit 2 Bedingungen

  Alt 21. Jun 2008, 14:07
Hi,

ich versteh´s noch nicht wirklich.

Zitat:
Wartung 100 (entspricht Anlage 99) --> Rückluftfilter --> Tätigkeit erledigt (Status 3)
Wartung 100 (entspricht Anlage 99) --> Zuluftfilter --> Tätigkeit unerledigt (Status 0)

Wartung 101 (entspricht Anlage 100) --> Rückluftfilter --> Tätigkeit unerledigt (Status 0)
Wartung 101 (entspricht Anlage 100) --> Zuluftfilter --> Tätigkeit erledigt (Status 3)
Hier hast du zwei Anlagen (99+100) mit jeweils verschiedenen Bezeichnungen (Rückluftfilter+Zuluftfilter).

demnach
where BEZEICHNUNG in (select BEZEICHNUNG from WARTUNGP müssten in Filtereinsatz mehrere Datensätze mit Anlage 100 vorliegen?

vllt. zeigst du mal die Struktur und Relationen deiner Tabellen komplett
Gruß
Norman
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.388 Beiträge
 
Delphi 12 Athens
 
#7

Re: SQL Syntax, Vergleich mit 2 Bedingungen

  Alt 21. Jun 2008, 20:12
Danke für Deine Hilfe...

ich habe in der zeit mit join experimentiert. Mal habe ich zu viele Datensätze mal zu wenig.

...ich kämpfe ! irgendwie geht das !

Bsp. etwas ausführlicher

Tabelle WARTUNGP
NUMMER --> BEZEICHNUNG --> STATUS --> TATIGKEIT // Feldnamen // Auszug der Tätigkeiten

Wartung 100 --> Rückluftfilter --> Tätigkeit erledigt (Status 3) --> 3205 * Filtermedium wechseln
Wartung 100 --> Zuluftfilter --> Tätigkeit unerledigt (Status 0) --> 3205 * Filtermedium wechseln
Wartung 101 --> Rückluftfilter --> Tätigkeit unerledigt (Status 0) --> 3205 * Filtermedium wechseln
Wartung 101 --> Zuluftfilter --> Tätigkeit erledigt (Status 3) --> 3205 * Filtermedium wechseln
Wartung 102 --> Rückluftfilter --> Tätigkeit unerledigt (Status 0) --> 3205 * Filtermedium wechseln
Wartung 102 --> Zuluftfilter --> Tätigkeit erledigt (Status 3) --> 3205 * Filtermedium wechseln
Wartung 103 --> Rückluftfilter --> Tätigkeit unerledigt (Status 0) --> 3205 * Filtermedium wechseln
Wartung 103 --> Zuluftfilter --> Tätigkeit erledigt (Status 3) --> 3205 * Filtermedium wechseln

Tabelle WARTUNGL
NUMMER --> ANLAGE // Feldnamen
Wartung 100 --> Anlage 99
Wartung 101 --> Anlage 100
Wartung 102 --> Anlage 101
Wartung 103 --> Anlage 102

Tabelle FILTEREINSATZ

ANLAGE --> BEZEICHNUNG --> GROSSE,MENGE,etc. // Feldnamen
Anlage 99 --> Rückluftfilter --> Eigenschaften
Anlage 99 --> Zuluftfilter --> Eigenschaften
Anlage 100 --> Rückluftfilter --> Eigenschaften
Anlage 100 --> Zuluftfilter --> Eigenschaften
Anlage 101 --> Rückluftfilter --> Eigenschaften
Anlage 101 --> Zuluftfilter --> Eigenschaften
Anlage 102 --> Rückluftfilter --> Eigenschaften
Anlage 102 --> Zuluftfilter --> Eigenschaften

Ergebnismenge nach obigem Bsp. soll sein aus Filtereinsatz:

ANLAGE --> BEZEICHNUNG --> ART etc. // Feldnamen
Anlage 99 --> Rückluftfilter --> Eigenschaften
Anlage 100 --> Zuluftfilter --> Eigenschaften
Anlage 101 --> Zuluftfilter --> Eigenschaften
Anlage 102 --> Zuluftfilter --> Eigenschaften


im Prinzip ist die Struktur wie oben. die Tabellen haben ansonsten keine Relationen.
Der Ablauf im Prinzip:
1. welche Filter (BEZEICHNUNG) sind Status = 3
2. Anlagennummer aus WARTUNGL holen nach NUMMER aus WARTUNGP
3. Datensätze aus FILTEREINSATZ nach ANLAGE, VERBRAUCH, BEZEICHNUNG



Danke nochmal...
  Mit Zitat antworten Zitat
NormanNG

Registriert seit: 1. Feb 2006
294 Beiträge
 
Delphi 2007 Professional
 
#8

Re: SQL Syntax, Vergleich mit 2 Bedingungen

  Alt 21. Jun 2008, 21:19
Hi,

hier noch ein Versuch - bin dann aber weg

SQL-Code:
select
  p.*, l.*, f.*
from wartungl l
join wartungp p on l.nummer = p.nummer and p.status = 3
join filtereinsatz f on f.anlage = l.anlage and f.bezeichnung = p.bezeichnung and f.verbrauch = 1
where p.tatigkeit = '3205 * Filtermedium wechseln'
Gruß
Norman
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.388 Beiträge
 
Delphi 12 Athens
 
#9

Re: SQL Syntax, Vergleich mit 2 Bedingungen

  Alt 21. Jun 2008, 21:39
Danke...

diese Variante hatte ich noch nicht... melde mich dann wieder.

Danke für Deine Geduld...
  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 12:56 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz