![]() |
Datenbank: firebird • Version: 2.0 • Zugriff über: Zeos
SQL Syntax, Vergleich mit 2 Bedingungen
Hallo an alle SQL Experten... :-D
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 :oops: eindeutig ist)
Delphi-Quellcode:
... 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.
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; ...jetzt kommts :wink: ...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:
... da jetzt die Bezeichnungen mehrfach vorkommen können muß ich den "Vergleich" mit der Anlagennummer koppeln.
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; Vergleich mit 2 Feldern :gruebel: 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... :mrgreen: Danke für Eure Ideen. |
Re: SQL Syntax, Vergleich mit 2 Bedingungen
Hi,
versuch´s mal so
SQL-Code:
getippt - nicht getestet
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 [edit, Code optimiert]
SQL-Code:
[/edit]
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 |
Re: SQL Syntax, Vergleich mit 2 Bedingungen
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. :( |
Re: SQL Syntax, Vergleich mit 2 Bedingungen
Hi,
Zitat:
|
Re: SQL Syntax, Vergleich mit 2 Bedingungen
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:
damit kriege ich logischerweise wieder alle Datensätze aus FILTEREINSATZ weil sowohl die Anlage durch
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;
Delphi-Quellcode:
als auch die Bezeichnung durch
(select ANLAGE from WARTUNGL where NUMMER in (select NUMMER from WARTUNGP where TATIGKEIT = :Tatigkeit and STATUS = 3)
Delphi-Quellcode:
vorhanden ist und über in alle Varianten möglich sind. :(
(select BEZEICHNUNG from WARTUNGP where TATIGKEIT = :Tatigkeit and STATUS = 3 and NUMMER in (select NUMMER from WARTUNGP where TATIGKEIT = :Tatigkeit and STATUS = 3)
ich müßte ANLAGE und BEZEICHNUNG zusammen aus einem Subselect mit and mit den anderen Bedingungen verknüpfen (VERBRAUCH) irgendwo habe ich einen Denkfehler :gruebel: |
Re: SQL Syntax, Vergleich mit 2 Bedingungen
Hi,
ich versteh´s noch nicht wirklich. Zitat:
demnach
SQL-Code:
müssten in Filtereinsatz mehrere Datensätze mit Anlage 100 vorliegen?
where BEZEICHNUNG in (select BEZEICHNUNG from WARTUNGP
vllt. zeigst du mal die Struktur und Relationen deiner Tabellen komplett :glaskugel: |
Re: SQL Syntax, Vergleich mit 2 Bedingungen
Danke für Deine Hilfe...
ich habe in der zeit mit join experimentiert. Mal habe ich zu viele Datensätze mal zu wenig. :oops: ...ich kämpfe ! :thumb: 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... |
Re: SQL Syntax, Vergleich mit 2 Bedingungen
Hi,
hier noch ein Versuch - bin dann aber weg :cheers:
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' |
Re: SQL Syntax, Vergleich mit 2 Bedingungen
Danke...
diese Variante hatte ich noch nicht... melde mich dann wieder. Danke für Deine Geduld... :thumb: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:26 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