Avatar billede teamdev Novice
28. februar 2012 - 14:38 Der er 4 kommentarer og
2 løsninger

update 2 rækker hvor række 1 id er i række 2

Hey,

Jeg har fornøjelsen af at sidde med en tabel i MS SQL
Jeg har et væld af records og en del af disse skal opdateres.

Jeg kan selvfølgelig godt gøre således:

Update KLASSER
set journalnummer = '85'
where journalnummer = '11'

Problemet er bare at jeg vil have opdateret et felt mere, i en anden række i samme tabel.

for hver sag er der 2 rækker i denne database

ID som er unik
SAGSID som der er i begge rækker
feltet journalnummer som har indholdet 11 og skal rettes til 85
feltet sortering, som hedder 1 når indholdet i journalnummer hedder 11 og 2 når indholdet i journalnummer hedder Gxy

det jeg altså gerne vil er at alle records med journalnummer 11 skal rettes til 85 og i samme ombæring skal records med samme sagsid og sorteringsværdi 2 opdateres til GGG

er det sort snak ?
28. februar 2012 - 15:05 #1
Det lyder som en utraditionel datastruktur.  Dit spørgsmål går på den bestående tabel, og der har jeg ikke umiddelbart et svar, men det ville formentligt være en simpel opgave med en anden tabelstruktur.  Ser din tabel omtrent således ud?

KLASSER
id sagsid journalnummer sortering
1    5        11            1
2    5        Gxy          2
3    13      25            1
4    13      Abc          2

I såfald, hvorfor ikke ændre til dette?  Det kunne gøres relativt simple med tilpassede mssql queries.

KLASSER
id  sagsid  journalnummer1 journalnummer2
1    5          11            Gxy
2    11        25            Abc

I så fald ville løsningen være noget med:

UPDATE KLASSER SET journalnummer1 = 85, journalnummer2 = 'GGG' WHERE journalnummer1 = 11

Eller har jeg misforstået spørgsmålet?
Avatar billede teamdev Novice
28. februar 2012 - 15:27 #2
Du har forstået det næsten helt korrekt.

Men det er ikke muligt at lave ændringen på tabelniveau

Tabel ser nemlig præcis sådan ud. :

KLASSER
id sagsid journalnummer sortering
1    5        11            1
2    5        Gxy          2
3    13      25            1
4    13      Abc          2

og da der ligger noget program og bruger tabel i dens nuværende form kan jeg altså ikke rette tabellen.

altså er jeg nok ude i et eller andet med at identificere sagsid hvor journalnummeret er 11 hælde det i en temp tabel
efterfølgende lave et update hvor alle sager med sagsid i original tabel og sortering = 2 som findes i temp tabel  skal have opdateret journalnummer med GGG

så er det bare lige at skrive en sjat sql der så gør det, og det volder mig lidt vanskeligheder.



noget i stil med

select sagsid, journalnummer from klasser where journalnummer= '11'

insert into temp_tbl




update klasser
set journalnummer ='GGG'
where sagsid
in(select sagsid from temp tabel)
Avatar billede teamdev Novice
28. februar 2012 - 15:30 #3
måske lidt mere sådan her



update klasser
set journalnummer ='GGG' where sortering = 2
and
sagsid in(select sagsid from temp tabel)
29. februar 2012 - 16:59 #4
Jeg har været fra det, men her er mit bud.  For test oprettede jeg en tabel teamdev som vist nedenfor.  Så kørte jeg disse fire queries (1) oprette en temporary tabel, (2) overføre dertil de sagsid'er hvor journalnummer = 11, (3) Update journalnummer til GGG hvor sortering = 2, og (4) update journalnummer til 85 where journalnummer = 11. 

CREATE TABLE teamdevtemp(sagsid INT);

INSERT INTO teamdevtemp (SELECT sagsid FROM teamdev WHERE journalnummer = 11);

UPDATE teamdev SET journalnummer = 'GGG' WHERE sortering = 2 AND sagsid IN (SELECT sagsid FROM teamdevtemp);

UPDATE teamdev SET journalnummer = '85' WHERE journalnummer = '11';

Her er teamdev tabellen jeg lavede:

CREATE TABLE teamdev(id INT, sagsid INT, journalnummer VARCHAR(10), sortering INT);

INSERT INTO teamdev VALUES(1, 1, '11', 1);
INSERT INTO teamdev VALUES(2, 1, 'abc', 2);
INSERT INTO teamdev VALUES(3, 2, '12', 1);
INSERT INTO teamdev VALUES(4, 2, 'def', 2);
INSERT INTO teamdev VALUES(5, 3, '11', 1);
INSERT INTO teamdev VALUES(6, 3, 'ghi', 2);
INSERT INTO teamdev VALUES(7, 4, '11', 1);
INSERT INTO teamdev VALUES(8, 4, 'jkl', 2);
INSERT INTO teamdev VALUES(9, 5, '13', 1);
INSERT INTO teamdev VALUES(10, 5, 'mno', 2);
05. marts 2012 - 06:04 #5
teamdev, fik du mit indlæg?  Kunne du bruge det?  Kom ind og fortæl.
Avatar billede teamdev Novice
14. marts 2012 - 07:05 #6
Svaret kan jeg ikke rigtigt anfægte :-) Det fik mig i hvertfald på rette vej


Et par ændringer:

Brug en temporær tabel
og nøjes med sagsid, resten skal ikke bruges.



Create table #tmp_sagsid (SagsID INT)



-- tag alle SagsID og sæt ind i temporær tabel

INSERT INTO #tmp_sagsid (SagsID)
select SagsID from Klasser
-- where statement udbygges med de nødvendige journalkoder enten med LIKE eller med =  ''
where Journalnummer = '11'
or Journalnummer ='12'
or Journalnummer = '16'


UPDATE Klasser SET Journalnummer = 'G01' where Sortering=2 and SagsID in(select SagsID from #temp_SagsID)

-- vi er færdige med den temporære tabel som droppes

drop table #temp_SagsID

-- så skal vi blot opdatere journalnummeret på de samme sager som før - her er det særligt vigtigt at where delen er identisk med den i det forrige insert statement

UPDATE Klasser SET Journalnummer = '85'
where Journalnummer='11'
or Journalnummer='12'
or Journalnummer='16'
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester