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

MS SQL ID Zuweisung über mehrere Felder...Update ?

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von dsnakas, 27 August 2013.

  1. dsnakas

    dsnakas Benutzer

    Hallo zusammen,

    ich hänge an einem Problem bisher dachte ich das die Lösung recht einfach aussieht...ich habe mich mal wieder getäuscht.

    Szenario:

    Tabelle "Basis_C" beinhaltet mehrere Kontakte mit der zugehörigen adresse
    Vorname | Name| PLZ | Strasse | Hausnummer | Status | C_verkaufer_nr|

    Status sagt aus ob die Hausnummer eine gerade oder ungerade Zahl ist.

    Tabelle "Zuordnung_P"
    PLZ | Strasse | von |bis |P_Status| P_verkaufer_id |

    |von| und |bis| beinhalten die Hausnummer range z.B. 0002 - 0020
    P_Status sagt aus ob die Hausnummer zuweisung gerade oder ungerade Hausnummer betrifft.

    d.h. eine verkaufs id kann in einer Straße mehrere Zuweisungen haben. Z.B. gerade hausnummern von 2-20 (status gerade) und ungerade Hausnummern vo

    n 21-39 (Status ungerade).

    Ich dachte ich kann nun via einem Update :
    Code:
    update Basis_C
     
        set Basis_C.C_verkaufer_nr =
        (
            select Zuordnung_P.P_verkaufer_id
       
               
            from Zuordnung_P, Basis_C
           
            where    Basis_C.Status  = Zuordnung_P.P_status           
                    and Basis_C.Strasse = Zuordnung_P.Strasse
                    and Basis_C.PLZ = Zuordnung_P.PLZ
                    and Basis_C.Hausnummer  >= Zuordnung_P.VON 
                    and Basis_C.Hausnummer  <= Zuordnung_P.BIS
                       
        )
       
    go
    die verkäufer_nr upzudaten. Leider scheint es so zu sein dass die Update funktion nicht versteht das in einer straße mit der gleichen Hausnummer mehrere Kontakte sein können.

    Hat einer eine idee wie ich das lösen könnte? Leider haben die 2 Tabellen kein wirkliches join Feld.
     
  2. dsnakas

    dsnakas Benutzer

    Fehlermeldung "Die Unterabfrage hat mehr als einen Wert zurückgegeben. Das ist nicht zulässig, wenn die Unterabfrage auf =, !=, <, <=, > oder >= folgt oder als Ausdruck verwendet wird."
     
  3. ukulele

    ukulele Datenbank-Guru

    Das SET Basis_C.C_verkaufer_nr wird für jeden Datensatz in der Tabelle ausgeführt und für jede dieser Operationen bekommst du in deinem Subselect alle Werte zurück geliefert. Du musst die Werte schon eingrenzen auf maximal einen. Dazu kannst du aus deinem Subselect auch die Tabelle Basis_C anspreachen um Werte zu vergleichen. Allerdings hast du diese Tabelle auch nochmal gejoint so das du in dem Subselect einen Alias vergeben musst um unterscheiden zu können.
     
  4. dsnakas

    dsnakas Benutzer

    könntest du ein kleines Bespiel dazu schreiben?Für mein Verständnis.

    gibt es eine lösung int MS SQCL mit

    where BeispielFeld in ('FeldStraße')
     
  5. ukulele

    ukulele Datenbank-Guru

    Das Prinzip ist simpel:
    Code:
    UPDATE    tabelle
    SET        spalte = (    SELECT    spalte
                        FROM    tabelle t2
                        WHERE    t2.id = tabelle.id )
    Hier wird tabelle.spalte mit sich selbst geupdatet weil der Select auf die selbe Tabelle (nur eben mit einem Alias) zugreift und den Wert ausließt wo die beiden IDs übereinstimmen. Das einzig verwirrende finde ich ist die Tatsache das man im Update Statement selbst keinen Alias setzen kann, im Subselect aber sehr wohl. Egal wie kompliziert der jetzt ist, er darf immer nur einen Wert an zurück geben.
     
  6. dsnakas

    dsnakas Benutzer

    Das Problem ist das es keine ID in beiden Tabellen gibt die quasi eindeutig sind. deswegen der vergleich sovieler Felder.
     
  7. akretschmer

    akretschmer Datenbank-Guru

    Also Du hast keinen Primary Key. FAIL!
     
  8. dsnakas

    dsnakas Benutzer

    Also in der tabelle Basis_C gibt es eine eindeutige ID aber in der Tabelle Zuordnung_P habe ich nur einen AutoWert hinzugefügt. Sprich die beiden haben nichts miteinander zu tun.
     
  9. dsnakas

    dsnakas Benutzer

    ich komm nicht weiter hat keiner eine idee?
     
  10. ukulele

    ukulele Datenbank-Guru

    Primary Key oder nicht du darfst immer nur einen Datensatz im Subselect haben. Im Zweifel kann man immer SELECT TOP 1 nutzen aber du musst dafür sorgen das der Subselect immer die Verkäufer ID liefert die zu dem jeweiligen Datensatz passt (ich kenne jetzt die Daten und Kriterien nicht) und nicht irgendeine und daher musst du dich im Subselect auf den grade upzudatenden Datensatz beziehen sonst macht es keinen Sinn :) Egal mit wievielen Kriterien. Wenn ich raten müsste:
    Code:
    UPDATE    Basis_C
    SET        Basis_C.C_verkaufer_nr = (    SELECT    TOP 1 Zuordnung_P.P_verkaufer_id
                                        FROM    Zuordnung_P
                                        WHERE    Basis_C.Status = Zuordnung_P.P_status         
                                        AND        Basis_C.Strasse = Zuordnung_P.Strasse
                                        AND        Basis_C.PLZ = Zuordnung_P.PLZ
                                        AND        Basis_C.Hausnummer  >= Zuordnung_P.VON
                                        AND        Basis_C.Hausnummer  <= Zuordnung_P.BIS )
     
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