![]() |
Datenbank: Firebird • Version: 2.5 • Zugriff über: IBDAC
SQL-Ausdruck gibt zu wenige DS zurück
Ich benötige aus der folgenden Tabelle alle Datensätze mit der UserID 1 und wenn es für NAME1 und NAME2 und keinen Datensatz mit der UserID 1 gibt, den zugehörigen Datensatz für die UserID 0.
Code:
Mein Versuch sieht so aus:
TABLE WERTE
----------------- PK NAME1 VARCHAR(20) NOT NULL PK NAME2 VARCHAR(20) NOT NULL PK USERID INTEGER NOT NULL WERT VARCHAR(20)
Code:
Da kommen dann aber nur die Datensätze mit UserID 1 zurück...
select * from WERTE
where (UserID = 1) or (UserID = 0 and not exists(select WERT from WERTE where UserID = 1)) |
AW: SQL-Ausdruck gibt zu wenige DS zurück
PK = Primary Key?
Zitat:
Da es 1 gibt, sagt das exists immer True und somit kommt natürlich auch kein 0. |
AW: SQL-Ausdruck gibt zu wenige DS zurück
Zitat:
Zitat:
|
AW: SQL-Ausdruck gibt zu wenige DS zurück
Wenn ich Dich richtig verstanden habe, dann sollte das in etwas so funktionieren:
SQL-Code:
SELECT a.*
FROM WERTE a WHERE (a.USERID = 1) OR ((a.USERID = 0) AND (NOT EXISTS (SELECT b.* FROM WERTE b WHERE b.USERID = 1 AND b.NAME1 != a.NAME1 and b.NAME2 != a.NAME2))) |
AW: SQL-Ausdruck gibt zu wenige DS zurück
Zitat:
Diese Felder waren in deinem Beschreibngssatz, also gehören sie auch in die Abfrage rein. Auch wenn das AS nicht unbedingt nötig ist, finde ich es eigentlich "verständlicher", wenn man es schreibt.
Delphi-Quellcode:
"alle" Felder aufzunehmen ist doch ein bissl sinnlos?
EXISTS(SELECT true FROM
Und Statt != meinst du bestimmt = ? Statt dem SubSelect könnte man bestimmt auch einen LEFT JOIN verwenden. |
AW: SQL-Ausdruck gibt zu wenige DS zurück
Werde Dein SQL mal etwas abkürzen unter der Voraussetzung, dass es mindestens einen Satz mit UserID 1 gibt.
SQL-Code:
Also Du fragst quasi ab, ob es einen Satz mit der UserID 1 gibt oder einen Satz mit UserID = 0 und nicht "wahr"
select * from WERTE
where (UserID = 1) or (UserID = 0 and not exists(True)) Entspricht ungefähr:
Code:
Bitte formuliere nochmal deine Aufgabenstellung genau aus, sie ist im ersten Post noch etwas "unscharf". Dann teile sie erstmal in die beiden Teile auf, die (vermutlich) dahinter stecken.
or (1 = 1 and not true) -> or (1 = 1 and false) -> or (true and false)
Den zweiten Teil müsstest Du dann in den "not exists"-Teil einfügen können. Dabei ist aber wesentlich, dass in der Where-Bedingung des zweiten Teiles auf den ersten Teil über irgendeinen Schlüssel verwiesen wird. Ohne diesen Verweis ist die Wherebedingung (wie momentan) so "unscharf", dass sie immer erfüllt ist und nicht nur für den konkret abzufragenden Datensatz. Oder anders formuliert: Momentan ist die not-exists-Klausel so unscharf, dass man sie auch getrost weglassen könnte, ohne dass sich das Ergebnis verändert. |
AW: SQL-Ausdruck gibt zu wenige DS zurück
SQL-Code:
Wenn ich die Bedingung richtig verstanden habe, sollte es das sein.
select *
from tabelle where userid=1 union select * from tabelle left join (select pk from tabelle where userid=1) ns on (ns.pk=tabelle.pk) where ns.pk is null Ggf. muß Userid=0 noch zugefügt werden. Gruß K-H |
AW: SQL-Ausdruck gibt zu wenige DS zurück
Kann es sein, dass Tabelle keine relationale Abbildung darstellt, sondern so eine Art Keyvalue Notation? Das würde ein etwas anderes Licht auf die Frage werfen.
Ansonsten wäre ich für eine Union Lösung wie von p80286, plus Aggregat dabei kommt am Ende etwa sowas raus:
SQL-Code:
Da name1 und name2 angeblich mit zum PK gehören und die Anforderung das berücksichtigen soll, müsste es erweitert so heißen (was allerdings der Aussage widerspricht, Name1 und 2 wären unbekannt)select * from tabelle t, (select max(userid) from tabelle where userid in (0,1) /*sicherheitshalber*/ and Name1!='' and Name2!='') filter where t.userid = filter.userid
SQL-Code:
select * from tabelle t, (select max(userid) from tabelle where userid =0 or (userid =1 and Name1=:pName1 and Name2=:pName2)) filter where t.userid = filter.userid |
AW: SQL-Ausdruck gibt zu wenige DS zurück
Da name1 und name2 explizit "not null" sind habe ich sie nicht beachtet.
Wobei mir die Aufgabenstellung etwas wirr vorkommt. Gruß K-H |
AW: SQL-Ausdruck gibt zu wenige DS zurück
Ja, deswegen habe ich die beiden Felder auch nicht gegen IS NULL geprüft.
Ich vermute es handelt sich um eine Key-Value "Implementierung". Könnte sein, dass hier User spezifische Werte abgefragt werden sollen und falls nicht vorhanden, sollen default Werte zurückkommen. Ohne weitere Infos vom TE wird das aber im Dunkeln bleiben. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:21 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