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

dsnakas

Benutzer
Beiträge
20
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.
 
Werbung:

dsnakas

Benutzer
Beiträge
20
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."
 

ukulele

Datenbank-Guru
Beiträge
4.394
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.
 

dsnakas

Benutzer
Beiträge
20
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')
 

ukulele

Datenbank-Guru
Beiträge
4.394
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.
 

dsnakas

Benutzer
Beiträge
20
Das Problem ist das es keine ID in beiden Tabellen gibt die quasi eindeutig sind. deswegen der vergleich sovieler Felder.
 

dsnakas

Benutzer
Beiträge
20
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.
 
Werbung:

ukulele

Datenbank-Guru
Beiträge
4.394
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 )
 
Oben