[(MS)SQL] Abfrage - Mehrfach auf 1 Wert

s09

Cadet 4th Year
Dabei seit
Juni 2007
Beiträge
111
Hallo

hätte eine frage bezüglich einer sql Abfrage, un zwar : ich möchte auf ein Wert mehrmals abfragen .. und habe dabei meine Probleme... komme an dem Punkt nicht weiter ->

PHP:
DB 0 ( obj)
GUID | **.... 
-----------------------------------------
yyyy-yy1 |....
yyyy-yy2 |....
yyyy-yy3 |....
PHP:
DB 1 (objd)
GUID | f_GUID | obj_guid | Value
-----------------------------------------
cccc-cc1 | xxx-x1... | yyyy-yy1 | 2
cccc-cc2 | xxx-x2... | yyyy-yy1 | 1990
cccc-cc3 | xxx-x1... | yyyy-yy2 | 4
cccc-cc4 | xxx-x2... | yyyy-yy2 | 1890
cccc-cc5 | xxx-x1... | yyyy-yy3 | 1

PHP:
DB 2 (fd)
f_GUID | Kürzel 
-----------------------------------------
xxx-x1... | Zimmer
xxx-x2... | Baujahr
PHP:
select 
	obj.guid,
	fd.kürzel,
	objd.value
from obj
inner join objd on obj.guid = objd.obj_guid
inner join fd on fd.f_GUID = objd.f_GUID

where
(
	(fd.kürzel = 'Zimmer' and objd.value = '2')
	and
	(fd.kürzel = 'Baujahr' and objd.value = '1990')
)
Hoffe habe jetzt keinen Fehler drin, eben alles nochmal pi mal Daumen aus dem Kopf...

hätte gerne nur die "obj" die, die where Klausel erfüllen.. aber ich bekomme nichts zurück
ändere ich das and in ein or, so bekomme ich natürlich auch die "obj" die überhaupt kein Baujahr haben!

und ergänzend dazu
das Feld objd.value ist ein varchar ( wenn ich es richtig in Erinnerung hab ) und würde dort between benutzen, bekomme dafür aber auch keine Werte zurück :/ in dem Feld objd.value sind nicht nur zahlen sondern teilweise auch Texte
 
Zuletzt bearbeitet:

mugam

Fleet Admiral
Dabei seit
Feb. 2006
Beiträge
11.488
8.where
9.(
10. (fd.kürzel = 'Zimmer' and objd.value = '2')
11. and
12. (fd.kürzel = 'Baujahr' and objd.value = '1990')
13.)

Das würde voraussetzen, dass fd.kürzel gleichzeitig Zimmer und Baujahr ist, das kann ja nicht sein,
somit wird nichts ausgegeben.

Da müßte doch bei 11. or hin ...
 

bu1137

Captain
Dabei seit
Apr. 2010
Beiträge
3.249
Wieso machst du nicht

Code:
select
    obj.guid,
    fd.kürzel,
    objd.value
    from obj
    inner join objd on obj.guid = objd.obj_guid

where
(
    (fd.kürzel = 'Zimmer' and objd.value = '2')
    or
    (fd.kürzel = 'Baujahr' and objd.value = '1990')
 )
 
Zuletzt bearbeitet: (Zeile gekillt)

s09

Cadet 4th Year
Ersteller dieses Themas
Dabei seit
Juni 2007
Beiträge
111
hätte gerne nur die "obj" die, die where Klausel erfüllen.. aber ich bekomme nichts zurück
ändere ich das and in ein or, so bekomme ich natürlich auch die "obj" die überhaupt kein Baujahr haben!
Entschuldige die frage , ist das den so unmöglich ?
führe ich die abfrage ohne where aus so bekomme ich ja

PHP:
obj.guid | fd.kürzel | objd.value
------------------------------------
yyyy-yy1 | Zimmer | 2
yyyy-yy1 | Baujahr | 1990
yyyy-yy2 | Zimmer | 4
yyyy-yy2 | Baujahr | 1890
yyyy-yy3 | Zimmer | 1
daher bin ich davon ausgegangen das die abfrage so klappt.

was ich mir durch die Abfrage erhofft habe wäre dies
PHP:
obj.guid | fd.kürzel | objd.value
------------------------------------
yyyy-yy1 | Zimmer | 2
yyyy-yy1 | Baujahr | 1990
yyyy-yy2 | Zimmer | 4
yyyy-yy2 | Baujahr | 1890
 

mugam

Fleet Admiral
Dabei seit
Feb. 2006
Beiträge
11.488
8.where
9.(
10. (fd.kürzel = 'Zimmer' and objd.value = '2')
11. and
12. (fd.kürzel = 'Baujahr' and objd.value = '1990')
13.)

So bezieht sich deine Where-Klausel auf ein- und denselben Datensatz,
d.h. fd.kürzel müßte in einem Datensatz gleichzeitig Zimmer und Baujahr sein und objd.value gleichzeitig 2 und 1990.
 

mugam

Fleet Admiral
Dabei seit
Feb. 2006
Beiträge
11.488
Deine Abfrage ohne where ergibt doch eigentlich schon das Ergebnis ...

Oder - was willst du denn Ermitteln ? Alle Zimmer zu denen es ein Baujahr gibt ??
Soll dieser Eintrag yyyy-yy3 | Zimmer | 1 im Ergebnis fehlen, weils dazu kein Baujahr gibt.
 
Zuletzt bearbeitet:

s09

Cadet 4th Year
Ersteller dieses Themas
Dabei seit
Juni 2007
Beiträge
111
Jaein, so wie die Abfrage da stehen würde ohne wäre es fast richtig was ich möchte , sie liefert mir aber auch obj die ich gar nicht will.
Die where Klausel sollte sich auf 1 obj beziehen, es sollte beides erfüllen zimmer & baujahr ( Eingrenzung, eine art filter damit nicht alle zurück gegeben werden )
möchte am ende alle obj die beide sachen erfüllen, keine anderen
 

mugam

Fleet Admiral
Dabei seit
Feb. 2006
Beiträge
11.488
Sag ich doch ..
Das kannst du aber nicht über eine where-klausel regeln.

Ob es Zimmer und Baujahr zu einer obj.guid gibt musst du auf anderem Weg prüfen.
 
Zuletzt bearbeitet:

mugam

Fleet Admiral
Dabei seit
Feb. 2006
Beiträge
11.488
Hab ich doch in Beitrag #8 nachgefragt:
Soll dieser Eintrag yyyy-yy3 | Zimmer | 1 im Ergebnis fehlen, weils dazu kein Baujahr gibt.
 
Zuletzt bearbeitet:

bu1137

Captain
Dabei seit
Apr. 2010
Beiträge
3.249
Ich glaub du verstehst selber nicht, was du willst - ich jedenfalls blicke da nicht mehr durch. Aber: Wenn du folgendes WHERE machst, muss Zimmer ja den Wert 2 haben. Du sagst jedoch, du willst auch Zimmer Einträge mit dem Wert 4. Dann lass halt "and objd.value = '2' weg.

Code:
where
(
(fd.kürzel = 'Zimmer' and objd.value = '2')
or
(fd.kürzel = 'Baujahr' and objd.value = '1990')
)
dasselbe mit dem Baujahr...

Code:
where
(
fd.kürzel = 'Zimmer'
or
fd.kürzel = 'Baujahr'
)
 

mugam

Fleet Admiral
Dabei seit
Feb. 2006
Beiträge
11.488
@bu1137 - er will alle obj.guid ausgeben, zu denen es Zimmer und Baujahr gibt.

1.obj.guid | fd.kürzel | objd.value
2.------------------------------------
3.yyyy-yy1 | Zimmer | 2
4.yyyy-yy1 | Baujahr | 1990
5.yyyy-yy2 | Zimmer | 4
6.yyyy-yy2 | Baujahr | 1890
7.yyyy-yy3 | Zimmer | 1

Die letzte Zeile soll wegbleiben, weil es zu der obj.guid yyyy-yy3 kein Baujahr gibt.
Eigentlich kein Problem, nur kenn ich die MSSQL-Syntax nicht genau,
bin normalerweise mit Informix-SQL unterwegs.
 
Zuletzt bearbeitet:

s09

Cadet 4th Year
Ersteller dieses Themas
Dabei seit
Juni 2007
Beiträge
111
@bu1137 - er will alle obj.guid ausgeben, zu denen es Zimmer und Baujahr gibt.
Genau, jedoch dazu eingrenzen ! darum auch Zimmeranzahl und Baujahr angegeben. Obj kann mehrere Obj enthalten, die darauf zutreffen ( zimmer = 2, baujahr = 1990 ) jedoch mit verschiedenen Guids

edit : sehe gerade habe in #4 nen Fehler gemacht, die Ausgabe sollte so sein !


PHP:
obj.guid | fd.kürzel | objd.value
------------------------------------
yyyy-yy1 | Zimmer | 2
yyyy-yy1 | Baujahr | 1990
sollte in obj nun ein weiteres obj drin sein, das darauf zutrifft so möchte ich

PHP:
obj.guid | fd.kürzel | objd.value
------------------------------------
yyyy-yy1 | Zimmer | 2
yyyy-yy1 | Baujahr | 1990
yyyy-yy* | Zimmer | 2
yyyy-yy* | Baujahr | 1990
Entschuldige !
 
Zuletzt bearbeitet:

mugam

Fleet Admiral
Dabei seit
Feb. 2006
Beiträge
11.488
Da wäre es sinnvoller, eine Tabelle anzulegen, in der Zimmerzahl und Baujahr zum einem Objekt stehen:

obj.guid |obj.Zimmerzahl | obj.Baujahr
yyyy-yy0 | 2 | 1990
yyyy-yy1 | 2 | 1990
yyyy-yy2 | 4 | 1890
yyyy-yy3 | 1 |



Hier fehlt übrigens noch die Verknüpfung zu fd ...
 
Zuletzt bearbeitet:

s09

Cadet 4th Year
Ersteller dieses Themas
Dabei seit
Juni 2007
Beiträge
111
auch keine richtige Option, höchstens durch eine temp Table
Zimmer, Baujahr sind nur beispiele. Sie können variieren zwischen weiteren ~30 anderen Optionen.. die Abfrage wird Dynamisch erstellt

Hier fehlt übrigens noch die Verknüpfung zu fd ...
hups :)
wäre
inner join fd on fd.f_GUID = objd.f_GUID
 
Zuletzt bearbeitet:

mugam

Fleet Admiral
Dabei seit
Feb. 2006
Beiträge
11.488
Denke schon, dass du temp tables benötigst,
auf direktem Wege kommst du bei der verqueren Struktur nicht weiter.

Oder du mußt zweimal mit objd und fd joinen (mit as arbeiten).
dann kannst du jeweils die Bedingungen setzen.
 
Zuletzt bearbeitet:

s09

Cadet 4th Year
Ersteller dieses Themas
Dabei seit
Juni 2007
Beiträge
111
Die 2. Option klingt gut, ergibt beim weiteren nachdenken auch mehr sinn, so kann ich tatsächlich mehrere Optionen auf das Feld abfragen

Testen kann ich das erst morgen und bedanke mich schon mal für die Hilfe !
 

AlbertLast

Lieutenant
Dabei seit
Juni 2002
Beiträge
715
Ich hätte auch eine Lösung anzubieten,
man beachte das ich bei Kürzel das ü in ue umgeschrieben habe...:
http://sqlfiddle.com/#!3/689e4/18/0

Das reine Select sieht bei mir so aus:
Code:
select 
	obj.guid,
	fdz.kuerzel kz,
	objdz.value vz,
    fdb.kuerzel bz,
    objdb.value vb
from obj
join objd objdz on obj.guid = objdz.obj_guid
join objd objdb on obj.guid = objdb.obj_guid
join fd fdb on (fdb.f_GUID = objdb.f_GUID and fdb.kuerzel = 'Baujahr') 
join fd fdz on (fdz.f_GUID = objdz.f_GUID and fdz.kuerzel = 'Zimmer') 

where
(
	(objdz.value = '2')
	and
	(objdb.value = '1990')
)
Da wäre es sinnvoller, eine Tabelle anzulegen, in der Zimmerzahl und Baujahr zum einem Objekt stehen
Unnötig, da die Daten bereits sauber normalisiert vorliegen.
 
Zuletzt bearbeitet: (where vereinfacht)
Top