Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

MSSQL Unterabfrage bei mehr als einen Wert

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von MysterioJN, 19 Januar 2017.

  1. MysterioJN

    MysterioJN Datenbank-Guru

    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
     
  2. akretschmer

    akretschmer Datenbank-Guru

    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)
    
     
  3. MysterioJN

    MysterioJN Datenbank-Guru

    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)
     
  4. akretschmer

    akretschmer Datenbank-Guru

    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)
    
    
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden