/ Forside / Teknologi / Udvikling / SQL / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
SQL
#NavnPoint
pmbruun 1704
niller 962
fehaar 730
Interkril.. 701
ellebye 510
pawel 510
rpje 405
pete 350
gibson 320
10  smorch 260
update flere felter fra subquery
Fra : Leif Neland


Dato : 05-01-07 15:13

MS-Sql

Jeg vil kopiere nogle felter fra en record til en anden.

Jeg kan godt kopiere et felt:
UPDATE produkter
SET billede = (
SELECT billede
FROM produkter
WHERE id = 20981)
WHERE id = 20982

men ikke flere:

UPDATE produkter
SET (billede, beskrivelse, pris) =
( SELECT (billede, beskrivelse, pris)
FROM produkter
WHERE id = 20981)
WHERE id = 20982

Hvordan skal jeg formulere det?

Leif



 
 
Jens Gyldenkærne Cla~ (05-01-2007)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 05-01-07 16:07

Leif Neland skrev:

> UPDATE produkter
> SET (billede, beskrivelse, pris) =
> ( SELECT (billede, beskrivelse,
> pris)
> FROM produkter
> WHERE id = 20981)
> WHERE id = 20982
>
> Hvordan skal jeg formulere det?

Du kan lave det som et pseudo-join

UPDATE p
SET billede = x.billede,
   beskrivelse = x.beskrivelse,
   pris = x.pris
FROM produkter p
INNER JOIN produkter x
   ON p.id = x.id + 1
WHERE p.id = 20982


Man kan også bare lave det kartesiske produkt (full outer join) og
så udvælge på det, men det kan potentielt give databasen lidt
rigeligt at lave (join-udtrykket returnerer ca N poster hvor det
kartesiske produkt levererer NxN før where-delen kommer ind)

Et alternativ er at gemme værdierne i en tablevariabel.
--
Bolig søges. Andel eller leje i Emdrup, Nordvest, Nørrebro, Søborg
eller Brønshøj, max 6000 pr. måned.
Kontakt pr. mail - nospam(at)gyros.dk
Jens Gyldenkærne Clausen

Leif Neland (06-01-2007)
Kommentar
Fra : Leif Neland


Dato : 06-01-07 16:01

Jens Gyldenkærne Clausen wrote:
> Leif Neland skrev:
>
>> UPDATE produkter
>> SET (billede, beskrivelse, pris) =
>> ( SELECT (billede, beskrivelse,
>> pris)
>> FROM produkter
>> WHERE id = 20981)
>> WHERE id = 20982
>>
>> Hvordan skal jeg formulere det?
>
> Du kan lave det som et pseudo-join
>
> UPDATE p
> SET billede = x.billede,
> beskrivelse = x.beskrivelse,
> pris = x.pris
> FROM produkter p
> INNER JOIN produkter x
> ON p.id = x.id + 1
> WHERE p.id = 20982
>
>
> Man kan også bare lave det kartesiske produkt (full outer join) og
> så udvælge på det, men det kan potentielt give databasen lidt
> rigeligt at lave (join-udtrykket returnerer ca N poster hvor det
> kartesiske produkt levererer NxN før where-delen kommer ind)

Nu er det tilfældigt at id2 = id1+1. Men mener du det belaster at joine på
at p.id=123 and x.id=456?

> Et alternativ er at gemme værdierne i en tablevariabel.


Jeg vil gerne slippe for at oprette en hel bunke variable og skulle huske at
escape dem passende for ' " osv..

Leif



Jens Gyldenkærne Cla~ (06-01-2007)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 06-01-07 18:00

Leif Neland skrev:

> Nu er det tilfældigt at id2 = id1+1. Men mener du det belaster
> at joine på at p.id=123 and x.id=456?

Jeg ved det ikke med sikkerhed - databasen kan muligvis optimere
forespørgslen så det ikke er noget problem. Men du kan evt. teste
med en queryplan for de forskellige modeller.

>> Et alternativ er at gemme værdierne i en tablevariabel.

> Jeg vil gerne slippe for at oprette en hel bunke variable

Du kan nøjes med én - og ingen form for escape (forudsat at du
arbejder i MSSQL 2000 eller nyere):

/* ************************************* */

DECLARE @tblTmp TABLE(
   id int,
   beskrivelse nvarchar(200),
   billede varchar(100),
   pris float
)

INSERT INTO @tblTmp (id, beskrivelse, billede, pris)
SELECT 3, beskrivelse, billede, pris
FROM produkter
WHERE id = 2

UPDATE p
SET   beskrivelse = t.beskrivelse,
   billede = t.billede,
   pris = t.pris
FROM produkter p
INNER JOIN @tblTmp t
ON p.id = t.id

/* ************************************* */

Med et par ekstra variable til id-værdierne bliver det lidt lettere
at se hvad der foregår (og der er stadig ikke brug for at escape):


/* ************************************* */

DECLARE @kildeID int
DECLARE @maalID int

SET @kildeID = 2
SET @maalID = 3

DECLARE @tblTmp TABLE(
   id int,
   beskrivelse nvarchar(200),
   billede varchar(100),
   pris float
)

INSERT INTO @tblTmp (id, beskrivelse, billede, pris)
SELECT @maalID, beskrivelse, billede, pris
FROM produkter
WHERE id = @kildeID

UPDATE p
SET   beskrivelse = t.beskrivelse,
   billede = t.billede,
   pris = t.pris
FROM produkter p
INNER JOIN @tblTmp t
ON p.id = t.id

/* ************************************* */

Hvis det er noget man har brug for flere gange, kan det hele puttes
i en lagret procedure (med de to id-variable som parametre)
--
Jens Gyldenkærne Clausen
Svar venligst under det du citerer, og citer kun det der er
nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og
hvordan på http://usenet.dk/netikette/citatteknik.html

Søg
Reklame
Statistik
Spørgsmål : 177580
Tips : 31968
Nyheder : 719565
Indlæg : 6409076
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste