[SQL] wijzigen van record met gegevens uit dezelfde tabel

Pagina: 1
Acties:
  • 503 views sinds 30-01-2008
  • Reageer

  • majornono
  • Registratie: Juni 2002
  • Laatst online: 03-02 14:55
Gegeven de volgende theoretische tabel Nummers:
code:
1
2
3
4
id  property
----------------
1   "een"
2   "twee"


Ik wil graag dat van het record met id 1 de property gezet wordt op de property van record id 2, zodat na verwerking de tabel er zo uit ziet:
code:
1
2
3
4
id  property
----------------
1   "twee"
2   "twee"

Ik kom tot het naast elkaar zetten van de oude waarde en de nieuwe waarde in 1 query:
code:
1
2
3
4
5
SELECT n1.property, n2.property
FROM Nummers n1
INNER JOIN Nummers n2
    ON n2.id = 2
WHERE n1.id = 1


Kan iemand mij aan een update statement helpen?
In de echte tabel zijn het veel meer eigenschappen, vandaar dat ik de volgende opties liever niet gebruik:
  • Het ophalen van de eigenschappen in variabelen (in de SP waar ik dit uitvoer)
  • Voor iedere eigenschap een sub select schrijven

Problem Exists Between Chair And Keyboard


  • 4of9
  • Registratie: Maart 2000
  • Laatst online: 13-12-2024
Dat moet wel te doen zijn met een UPDATE FROM

Aspirant Got Pappa Lid | De toekomst is niet meer wat het geweest is...


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Hoe gaat het verder? Moet het record met Id 4 de waarde van 3 krijgen? Missen er id's? Zo ja wat moet daarmee gebeuren?

Oops! Google Chrome could not find www.rijks%20museum.nl


  • majornono
  • Registratie: Juni 2002
  • Laatst online: 03-02 14:55
dat het met een UPDATE FROM moet lukken had ik ook al bedacht, maar die van mij werkt niet:
(foutmelding: The table 'Nummers' is ambiguous.)
code:
1
2
3
4
5
6
UPDATE Nummers
SET n1.property = n2.property
FROM Nummers n1
INNER JOIN Nummers n2
    ON n2.id = 2
WHERE n1 = 1


Ik wil alleen dit specifieke record aanpassen met de gegevens uit het andere record. Alle andere records blijven ongemoeid

[ Voor 11% gewijzigd door majornono op 14-06-2006 14:09 . Reden: foutmelding ingevoegd ]

Problem Exists Between Chair And Keyboard


  • 4of9
  • Registratie: Maart 2000
  • Laatst online: 13-12-2024
Ik begrijp toch niet helemaal wat je wilt.

Zoals ik het nu begrijp wil je veld met id 1 de waarde vervangen door de waarde van veld met id 2.

Zijn dit altijd maar 2 velden?

of gaat dit door? dus veld met id 2 krijgt waarde van veld met id 3?

zo ja dan is een userdefined function denk ik wel een uitkomst.

Aspirant Got Pappa Lid | De toekomst is niet meer wat het geweest is...


  • The Fox NL
  • Registratie: Oktober 2004
  • Laatst online: 14-02 22:37
update nummers set property = (select property from nummers where id = 2) where id = 1;

Dit is dan in Oracle, getest en werkt.


edit: oeps, zie net dat de TS geen subselect wil voor elke veld.

edit2: Gevonden, dit moet werken:
code:
1
2
3
4
5
6
7
UPDATE nummers n1
SET (n1.property, n1.property2) = (
   SELECT n2.property, n2.property2
   FROM nummers n2
   WHERE n2.id = 2
   )
WHERE n1.id = 1;


Dit is dan op een tabel een tabel met iets meer velden om te illustreren dat je geen subquery nodig hebt voor elk veld (zoals in mijn eerste voorbeeld):
code:
1
2
3
4
5
CREATE TABLE nummers (
id NUMBER,
property VARCHAR2(100),
property2 VARCHAR2(100)
);

[ Voor 76% gewijzigd door The Fox NL op 14-06-2006 14:47 ]


  • majornono
  • Registratie: Juni 2002
  • Laatst online: 03-02 14:55
Ik wil precies wat Fox heeft gedaan in zijn subselect, maar dan zonder subselect. Het zijn nl. meerdere properties. Daarnaast wil ik dat bij een nieuwe kolom dit statement blijft werken en de nieuwe kolom ook wordt meegenomen.

Problem Exists Between Chair And Keyboard


  • The Fox NL
  • Registratie: Oktober 2004
  • Laatst online: 14-02 22:37
Zie mijn wijziging in bovenstaande post ;)

Maar je zal het statement wel bij moeten werken voor elk nieuw veld, dus steeds de veldnamen toevoegen in regel 2 en 3.

[ Voor 60% gewijzigd door The Fox NL op 14-06-2006 14:53 ]


  • sig69
  • Registratie: Mei 2002
  • Laatst online: 16:52
Tsja dan zal je toch echt iets met de metadata van de tabellen moeten gaan doen, dynamisch aan de hand van de kolmnamen een query opbouwen en die uitvoeren. Hangt een beetje van je dbms af hoe een en ander het makkelijkst te doen is.

Roomba E5 te koop


  • majornono
  • Registratie: Juni 2002
  • Laatst online: 03-02 14:55
The Fox NL schreef op woensdag 14 juni 2006 @ 14:51:
Zie mijn wijziging in bovenstaande post ;)

Maar je zal het statement wel bij moeten werken voor elk nieuw veld, dus steeds de veldnamen toevoegen in regel 2 en 3.
Dat zag er erg hoopvol uit, maar helaas pikt MS-SQL de syntax niet, Hij heeft een foutmelding op het eerste haakje :-(

De oplossing van sig69 klinkt niet echt fraai.

[ Voor 6% gewijzigd door majornono op 14-06-2006 15:00 ]

Problem Exists Between Chair And Keyboard


  • sig69
  • Registratie: Mei 2002
  • Laatst online: 16:52
Dat is ie ook niet, maar ik denk dat je er niet aan gaat ontkomen aangezien je nieuwe kolommen ook automatisch mee wil nemen.

Edit: misschien een beetje verkeerd begrepen...

[ Voor 17% gewijzigd door sig69 op 14-06-2006 15:08 ]

Roomba E5 te koop


  • majornono
  • Registratie: Juni 2002
  • Laatst online: 03-02 14:55
Alleen de naam van een kolom toevoegen is geen probleem, maar een subselect voor iedere kolom maakt de query per kolom trager.

Problem Exists Between Chair And Keyboard


  • The Fox NL
  • Registratie: Oktober 2004
  • Laatst online: 14-02 22:37
Ik ben geen MS-SQL expert. Maar op google zie ik wat constructies met die UPDATE FROM.

Kan deze in MS-SQL?:
code:
1
2
3
4
UPDATE Nummers n1
SET n1.property = n2.property, n1.property2 = n2.property2
FROM (SELECT property, property2 FROM Nummers WHERE id = 2) AS n2
WHERE n1.id = 1


Misschien hoort die AS uit regel 3 er niet en moet je hem weghalen. Op internet kwam ik deze constructie tegen:
code:
1
2
3
4
5
6
7
8
9
10
11
12
create table x(i int identity, 
               a char(1))
insert into x values ('a')
insert into x values ('b')
insert into x values ('c')
insert into x values ('d')
select * from x

update x
set a = b.a
from (select max(a) as a from x) b 
where i > 2

Heeft dezelfde opbouw als mijn bovengenoemde query, maar dan het woordje AS weggelaten.

[ Voor 46% gewijzigd door The Fox NL op 14-06-2006 15:34 ]


  • moozzuzz
  • Registratie: Januari 2005
  • Niet online
Bij selecteren werk ik in elk geval als volgt, heb het even met Updaten in het voorbeeld gezet:
SQL:
1
2
3
UPDATE nummers AS A, nummers AS B
SET B.content = A.content
WHERE B.id = 2 AND A.id=1

Gewoon je tabel twee verschillende aliassen geven. Of het in MSSQL werkt weet ik niet.

  • majornono
  • Registratie: Juni 2002
  • Laatst online: 03-02 14:55
The Fox NL schreef op woensdag 14 juni 2006 @ 15:12:
Ik ben geen MS-SQL expert. Maar op google zie ik wat constructies met die UPDATE FROM.

Kan deze in MS-SQL?:
code:
1
2
3
4
UPDATE Nummers n1
SET n1.property = n2.property, n1.property2 = n2.property2
FROM (SELECT property, property2 FROM Nummers WHERE id = 2) AS n2
WHERE n1.id = 1
Deze werkt. Ik ken de constructie maar daar had ik nog niet aan gedacht. Bedankt!

Problem Exists Between Chair And Keyboard


  • majornono
  • Registratie: Juni 2002
  • Laatst online: 03-02 14:55
moozzuzz schreef op woensdag 14 juni 2006 @ 15:18:
Bij selecteren werk ik in elk geval als volgt, heb het even met Updaten in het voorbeeld gezet:
SQL:
1
2
3
UPDATE nummers AS A, nummers AS B
SET B.content = A.content
WHERE B.id = 2 AND A.id=1

Gewoon je tabel twee verschillende aliassen geven. Of het in MSSQL werkt weet ik niet.
Je kunt in MS-SQL geen aliassen gebruiken in het UPDATE gedeelte van een query, alleen in de FROM .

Problem Exists Between Chair And Keyboard

Pagina: 1