MSSQL Unterabfrage bei mehr als einen Wert

MysterioJN

SQL-Guru
Beiträge
158
Moin zusammen.

Tabelle 1 Teilveroeff:
Bstnr1
25
30


Tabelle 2 MedStamm:
rowid, BstNr, Titel
1, 25, Auto
2, 25, Motorrad
3, 30, Flugzeug


Wenn ich in einem Sub-Select eine Titelabfrage aus einer anderen Tabelle "MedStamm" mache, an der die Bestellnummer gleich ist, ABER der Titelname sich gegebenenfalls verändert haben könnte - mehr als ein eindeutiger Titel - wirft er mir den Fehler:

"Die Unterabfrage hat mehr als ein Wert zurückgegeben."

In der abgefragten Untertabelle "MedStamm" gibt ex noch eine autoid (primaryKey).

Frage: Kann ich den Subselect irgendwie erweitern, das er mir bei (mehrfach) passender Bestellnummer nur den neuesten Titel verwendet? Sprich die neueste rowid?



USE aid_Medien

SELECT
BstNr,
(SELECT LEFT(MedStamm.Titel, 20) FROM MedStamm WHERE MedStamm.BstNr = Teilveroeff.BstNr1) AS Titel

FROM aid_medien.dbo.Teilveroeff



Ich hoffe echt das ich mich verständlich ausgedrückt habe und ersehne eine Lösung. Dank schön im Voraus für Diese!

grüße

Marco
 
Werbung:
warum machst nicht einfach einen Left Join, oder versteh ich Dein Problem grad nicht?

Code:
test=*# select * from teildingens ;
 bstnr
-------
  25
  30
(2 Zeilen)

test=*# select * from medstamm ;
 rowid | bstnr |  titel   
-------+-------+----------
  1 |  25 | auto
  2 |  25 | motorrad
  3 |  30 | flugzeug
(3 Zeilen)

test=*# select * from teildingens left join medstamm on teildingens.bstnr=medstamm.bstnr;
 bstnr | rowid | bstnr |  titel   
-------+-------+-------+----------
  25 |  1 |  25 | auto
  25 |  2 |  25 | motorrad
  30 |  3 |  30 | flugzeug
(3 Zeilen)
 
Hmm nein denke du verstehst das schon richtig. Das Problem ist nur, das der obere Part nur ein kleiner Teil eines selectes ist.
Aber selbst wenn ich ihn mit Left Join baue, das selbe Problem habe ich auch dann, bei mehreren Treffern unterschiedlicher Titel bei gleichen BstNr.
Daher suche ich ja, das ehr mir den aktuellsten Titel der bisher angelegt wurde (z.B. festgemacht an der rowid).

Hab ja versucht so was wie WHERE Tabelle1.bstnr = tabelle2.bstnr AND Max(rowid)
 
Werbung:
Dann must halt erst mal aggregieren un ddann joinen. Da gibt es mehrere Wege...

Code:
test=*# select foo.bstnr, foo.titel from teildingens left join (select bstnr, titel, row_number() over (partition by bstnr order by rowid) from medstamm) foo on ((teildingens.bstnr,1)=(foo.bstnr,row_number));
 bstnr |  titel   
-------+----------
  25 | auto
  30 | flugzeug
(2 Zeilen)

test=*# select foo.bstnr, foo.titel from teildingens left join (select bstnr, titel, row_number() over (partition by bstnr order by rowid desc) from medstamm) foo on ((teildingens.bstnr,1)=(foo.bstnr,row_number));
 bstnr |  titel   
-------+----------
  25 | motorrad
  30 | flugzeug
(2 Zeilen)
 
Zurück
Oben