Update table mit values von temp Table in einem query

db_gustl

Benutzer
Beiträge
13
Hallo zusammen,

ich habe folgende Tabellen:
phonenumbers:
Code:
id   value    sn      lot       reserved_datetime
1    21700    NULL    123       NULL
2    21701    NULL    123       NULL
3    21702    NULL    123       NULL
4    21703    NULL    999       NULL
5    21704    NULL    999       NULL
6    21705    NULL    999       NULL
#sn:
Code:
  DROP TABLE IF EXISTS #SN
  CREATE TABLE #SN
  (
    SN nvarchar(50)
  )

  INSERT INTO #SN (SN) VALUES ('SLB1')
  INSERT INTO #SN (SN) VALUES ('SLB2')
  INSERT INTO #SN (SN) VALUES ('SLB3')

Nun möchte ich in diesem Beispiel die Werte aus #SN in die Tabelle phonenumbers dem lot 123 einfügen.
Und zwar in der gleichen Reihenfolge wie die Tabellen jetzt angezeigt werden. So sind sie auch in den SELECTs drin.

Ich möchte hier nicht mit foreach arbeiten, sondern nur ein query aufrufen welches das Update macht.

Habt ihr eine Idee wie der UPDATE Befehl aussehen könnte? Hier muss ich die Tabellen doch vereinen und Update machen oder?

Die Tabelle soll danach so aussehen:
Code:
id   value    sn      lot       reserved_datetime
1    21700    SLB1    123       2020-08-20 14:00:00.000
2    21701    SLB2    123       2020-08-20 14:00:00.000
3    21702    SLB3    123       2020-08-20 14:00:00.000
4    21703    NULL    999       NULL
5    21704    NULL    999       NULL
6    21705    NULL    999       NULL

Viele Grüße
Gustl
 
Werbung:
Okay, probieren wir mal ...

Code:
test=# select * from p;
 id | sn | lot
----+----+-----
  1 |    | 123
  2 |    | 123
  3 |    | 123
  4 |    | 999
  5 |    | 999
  6 |    | 999
(6 rows)

test=*# select * from s;
  sn  
------
 slb1
 slb2
 slb3
(3 rows)

test=*# with x as (select id, row_number() over (order by id) from p where lot = 123), y as (select sn, row_number() over (order by sn) from s), xy as (select x.id, y.sn from x inner join y on (x.row_number = y.row_number)) update p set sn = xy.sn from xy where p.id=xy.id;
UPDATE 3

test=*# select * from p order by id;
 id |  sn  | lot
----+------+-----
  1 | slb1 | 123
  2 | slb2 | 123
  3 | slb3 | 123
  4 |      | 999
  5 |      | 999
  6 |      | 999
(6 rows)

test=*#

PostgreSQL, keine Garantie, ob das mit M$SQL auch funktioniert.
 
Werbung:
Super, das hat mir sehr weiter geholfen. Habe es nun mit einer weiteren temporären Tabelle gelöst, die könnte ich mir noch sparen. Aber wegen der Übersicht lass ich sie drin.

Code:
DROP TABLE IF EXISTS #SNID_JOIN
    CREATE TABLE #SNID_JOIN
    (
      id int,
      sn nvarchar(50)
    )
  
   INSERT INTO #SNID_JOIN
   SELECT a.id, b.sn
   FROM
   (select id, row_number() over (order by id)  as rowNumber from phonenumbers where lot = @lot) a
   LEFT JOIN
   (select sn, row_number() over (order by sn)  as rowNumber from #SN) b
   ON a.rowNumber = b.rowNumber
  
   SELECT * FROM #SNID_JOIN

   update t_ane_phonenumber set reserved_datetime = getdate(), sn = a.sn from #SNID_JOIN a where phonenumbers.id=a.id

klappt einwandfrei.

Vielen Dank für deine Unterstützung. Freu mich sehr :)

Viele Grüße
Gustl
 
Zurück
Oben