bedingte Werte

SQL_Dummie

Benutzer
Beiträge
24
Hallo liebe Community,

ich habe ein kleines Problem wo ich nicht weiss wie ich es gelöst bekomme:

Folgende Situation / Tabellen:

Tabelle 1:
ID / Pos_X / Pos_Y / Pos_Z
1 / 10.0 / 11.0 / 12.0
2 / 20.0 / 21.0 / 22.0
3 / 30.0 / 31.0 / 32.0


Tabelle 2:
ID / UserPos / Pos_X / Pos_Y / Pos_Z
1 / 0 / 0.0 / 0.0 / 0.0
2 / 0 / 0.0 / 0.0 / 0.0
3 / 1 / 90.0 / 91.0 / 92.0


Jetzt möchte ich eine Abfrage erstellen, die auf den Wert "UserPos" in der Tabelle2 schaut, wenn dort eine 0 steht dann die Positionswerte (X,Y,Z) aus der Tabelle1 rausgibt, steht in "UserPos" aber eine 1, dann die Werte aus der Tabelle2 anzeigt.
Also mit folgendem Ergebniss:
ID / UserPos / Pos_X / Pos_Y / Pos_Z
1 / 0 / 10.0 / 11.0 / 12.0
2 / 0 / 20.0 / 21.0 /22.0
3 / 1 / 90.0 / 91.0 / 92.0


Kann mir bitte einen Tipp geben wie ich solch eine Abfrage erstelle. Vielen Dank!

 
Werbung:
Hallo akretschmer,

vielen Dank für den Tip, bin damit auf jeden Fall schon mal weiter gekommen.

Im Moment habe ich es folgendermaßen gelöst:
View_1:
SELECT tbTabelle1.ID, tbTabelle2.userMode, tbTabelle1.Pos_X, tbTabelle1.Pos_Y, tbTabelle1.Pos_Z, tbTabelle2.Pos_X AS Pos_X2, tbTabelle2.Pos_Y AS Pos_Y2, tbTabelle2.Pos_Z AS Pos_Z2
FROM tbTabelle1 INNER JOIN
tbTabelle2 ON tbTabelle1.ID = dbo.tbTabelle2.ID
Ergebniss:
ID / UserPos / Pos_X / Pos_Y / Pos_Z/ Pos_X2 / Pos_Y2 / Pos_Z2
1 / 0 / 10.0 / 11.0 / 12.0 / 0.0 / 0.0 / 0.0
2 / 0 / 20.0 / 21.0 /22.0 / 0.0 / 0.0 / 0.0
3 / 1 / 30.0 / 31.0 / 32.0 / 90.0 / 91.0 / 92.0

Dann ein Query:
SELECT ID, userMode,
CASE WHEN userMode = 1 THEN Pos_X2 ELSE Pos_X END AS Pos_X,
CASE WHEN userMode = 1 THEN Pos_Y2 ELSE Pos_Y END AS Pos_Y,
CASE WHEN userMode = 1 THEN Pos_Z2 ELSE Pos_Z END AS Pos_Z
FROM View_1

Ergebniss:
ID / UserPos / Pos_X / Pos_Y / Pos_Z
1 / 0 / 10.0 / 11.0 / 12.0
2 / 0 / 20.0 / 21.0 /22.0
3 / 1 / 90.0 / 91.0 / 92.0

Das passt auch soweit!
Jetz die Frage: Kann ich das auch irgendwie in EINE Abfrage packen?
 
Code:
SELECT ID, userMode,
CASE WHEN userMode = 1 THEN Pos_X2 ELSE Pos_X END AS Pos_X,
CASE WHEN userMode = 1 THEN Pos_Y2 ELSE Pos_Y END AS Pos_Y,
CASE WHEN userMode = 1 THEN Pos_Z2 ELSE Pos_Z END AS Pos_Z
FROM ( 
SELECT tbTabelle1.ID, tbTabelle2.userMode, tbTabelle1.Pos_X, tbTabelle1.Pos_Y, tbTabelle1.Pos_Z, tbTabelle2.Pos_X AS Pos_X2, tbTabelle2.Pos_Y AS Pos_Y2, tbTabelle2.Pos_Z AS Pos_Z2
FROM tbTabelle1 INNER JOIN
tbTabelle2 ON tbTabelle1.ID = dbo.tbTabelle2.ID ) as my_view ;

einfach via Copy & Paste, ungetestet, weil ich kein M$SQL und nicht Deine Tabellen hab.
 
Hier noch eine Variate die ich herausgefunden habe mit dem gleichen Ergebniss.

SELECT tbTabelle2.ID, tbTabelle2.userMode,
CASE WHEN userMode = 1 THEN tbTabelle2.Pos_X ELSE tbTabelle1.Pos_X END AS Pos_X,
CASE WHEN userMode = 1 THEN tbTabelle2.Pos_Y ELSE tbTabelle1.Pos_Y END AS Pos_Y,
CASE WHEN userMode = 1 THEN tbTabelle2.Pos_Z ELSE tbTabelle1.Pos_Z END AS Pos_Z
FROM tbTabelle1 INNER JOIN tbTabelle2 ON tbTabelle1.ID = tbTabelle2.ID;
 
Perfekt! Vielen Dank!!!!
Hab zwar genauso gemacht, NUR hatte ich das "as my_view" nicht und schon klappt nix.
Danke dir.

Tja, kam da keine sinnvolle Fehlermeldung? Bei mir sähe das so aus:

Code:
test=*# select * from (select 1);
FEHLER:  Unteranfrage in FROM muss Aliasnamen erhalten
LINE 1: select * from (select 1);
                      ^
HINT:  Zum Beispiel FROM (SELECT ...) [AS] xyz.
test=*# select * from (select 1) as mytest;
 ?column?
----------
        1
(1 row)

test=*#

bessere Datenbank, oder?
 
Tja, kam da keine sinnvolle Fehlermeldung?

Leider nein. Folgende Fehlermeldung kam ohne das "as my_view":
Code:
Msg 102, Level 15, State 1, Line 8
Falsche Syntax in der Nähe von ';'.

Completion time: 2021-02-03T13:00:29.6267637+01:00


bessere Datenbank, oder?
Bestimmt ;), private nutze ich für meine Hobbyprojekte MariaDB aber in diesem Fall musste es Microsoft SQL sein :eek:.

Danke dir für die super schnelle Antworten.
 
Werbung:
Tja, kam da keine sinnvolle Fehlermeldung? Bei mir sähe das so aus:

Code:
test=*# select * from (select 1);
FEHLER:  Unteranfrage in FROM muss Aliasnamen erhalten
LINE 1: select * from (select 1);
                      ^
HINT:  Zum Beispiel FROM (SELECT ...) [AS] xyz.
test=*# select * from (select 1) as mytest;
 ?column?
----------
        1
(1 row)

test=*#

bessere Datenbank, oder?
Nö, eigentlich nicht. Aber da Du selbst keinerlei Ahnung von MS SQL Server hast, kannst Du es auch gar nicht beurteilen. Aber Fanboys sind nunmal so.
 
Zurück
Oben