UPDATE GRUND_TABEL SET GRUND_TABEL.DATO = VIEW.DATO WHERE GRUND_TABEL.ID1 = VIEW.ID1
Lidt uklart formuleret, så jeg forventer det er dette du ønsker at opnå? Ellers må du jo lige skrive lidt mere og vise noget mere data så vi kan løse det for dig :o)
UPDATE GRUND_TABEL SET GRUNDTABEL.TIlDATO = TILDATO (hvor jeg skal finde TILDATOEN ud fra det unikke ID i GRUNDTABEL = ID2, altså der skal ske en form for opslag.. hvilket skal ske for alle rækker i mit view) WHERE (det unikke id i GRUNDTABEL) = ID1
Kan du skrive noget konkret data op, bare lige 2 linjer med ID og dato, vise hvordan resultatet skal se ud efter din update? Det ville gøre det hele lidt mere synligt...
UPDATE GRUND_TABEL SET GRUND_TABEL.TIL = (SELECT TIL FROM GRUND_TABEL WHERE ID = view.ID2) FROM VIEW INNER JOIN GRUND_TABEL ON view.ID1 = GRUND_TABEL.ID WHERE ID = VIEW.ID1
UPDATE GRUND_TABEL SET GRUND_TABEL.Tildato = G2.Tildato INNER JOIN VIEW AS V1 ON view.ID1 = GRUND_TABEL.ID INNER JOIN GRUND_TABEL AS G2 ON V1.ID1 = G2.ID WHERE ID = VIEW.ID1
Det vi ønsker at opnå er at du laver en self join mod din grundtabel. Fordi du har et view som indeholder ID'et på den række der skal opdateres og ID'et med den række vi skal hente fra, så skal du lave 2 joins. Et join til at finde rækken der skal ændres (hvor din where sætning slår igennem) og et til at finde den række hvor du vil hente til datoen.
Lidt svært finde runde i dine navne på dine kolonner, prøv at kalde dem hvad de hedder i virkeligheden eller kald dem det samme hele vejen igennem dine eksempler :o)
Testet med de navne du har oplyst klokken 14:50:56:
UPDATE dbo.GRUND_TABEL
SET dbo.GRUND_TABEL.TILDATO = G2.TILDATO FROM dbo.[VIEW] AS V INNER JOIN dbo.GRUND_TABEL ON V.START_ID = dbo.GRUND_TABEL.UNIKT_ID INNER JOIN dbo.GRUND_TABEL AS G2 ON G2.UNIKT_ID = V.SLUT_ID WHERE dbo.GRUND_TABEL.UNIKT_ID = V.START_ID
Ok, tror jeg har fået UPDATE delen til at virke. SÅ kommer næste problem.
Nu skal den "unødvendige" record slettes. Men hvordan finder jeg frem til den, når mit view er blevet opdateret (tomt) efter min update.
Jeg kan altså ikke lave en DELETE FROM GRUND_TABEL where ID in (SELECT ID2 from VIEW)
Er det muligt at køre både UPDATE/DELETE statement i en form for transaction, så mit view ikke bliver opdateret inden jeg når til mit DELETE statement.?
Jeg synes lige du skal se om dette kan give dig id'er på de dubletter du vil slette, ellers skal du bare vende < tegnet til > og se om det giver det rigtige. Hvis ja, så bruger det bare det som en subquery til en delete statement...
SELECT G1.UNIKT_ID FROM dbo.GRUND_TABEL AS G1 INNER JOIN dbo.GRUND_TABEL AS G2 ON G1.TILDATO = G2.TILDATO WHERE DATEDIFF(dd, G1.FRADATO, G1.TILDATO) < DATEDIFF(dd, G2.FRADATO, G2.TILDATO)
DELETE dbo.GRUND_TABEL WHERE UNIKT_ID IN ( SELECT DISTINCT G1.UNIKT_ID FROM dbo.GRUND_TABEL AS G1 INNER JOIN dbo.GRUND_TABEL AS G2 ON G1.TILDATO = G2.TILDATO WHERE DATEDIFF(dd, G1.FRADATO, G1.TILDATO) < DATEDIFF(dd, G2.FRADATO, G2.TILDATO))
Umiddelbart giver det mig ikke det rigtige, da der kan være mange rækker med samme tildato. Jeg har overvejet om en TEMP tabel med indholdet (de 2 I´s) er vejen frem og så trunkere denne pr. gennemløb, men jeg er lidt bange for det overhead det vil give.
Men hvis du gerne vil have gang i noget Foreach lignende fra C#, så kan du jo lave en Stored Procedure skrevet i C#...
Synes godt om
Ny brugerNybegynder
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.