Avatar billede bernhof Nybegynder
10. december 2004 - 21:03 Der er 11 kommentarer og
2 løsninger

Samme subquery skal bruges flere gange

Hej,

Jeg står og skal bruge en subquery flere gange i forbindelse med nogle updates/deletes, og ville vide om man ikke fx kan deklarere en variabel og sætte den lig denne subquery fx, så man er fri for at skrive den flere gange:

DECLARE @MinQuery (SELECT --- FROM --- WHERE ---)

DELETE FROM ---- WHERE felt IN @MinQuery
UPDATE --- SET ---- WHERE felt IN @MinQuery

osv. Kan det lade sig gøre?
(jeg er forholdsvis ny i SQL :)
Avatar billede trer Nybegynder
10. december 2004 - 21:30 #1
Desværre ikke.

Er din query kompleks nok, kan du overveje et view eller en funktion. Men i 9 ud af 10 tilfælde er en smule redundans i ens sql at foretrække, det er simplere at styre.

I øvrigt bør overveje at skrive hele din delete og update ind som stored procedures fremfor at kalde dem som ad hoc sql.

create procedure deletesomething (@id )
as
begin
  set nocount on
  delete from dbo.MyTable as M
  where m.id = @id
end
go

Det vil performe væsentligt bedre.
Avatar billede arne_v Ekspert
10. december 2004 - 23:05 #2
Hvis den subquery skal bruges rigtigt mange gange og den er meget tung, så kunne
det måske betale sig at hælde output fra den i en temporær tabel.
Avatar billede bernhof Nybegynder
11. december 2004 - 00:58 #3
Den er ikke særlig tung. Det var nu mere for at undgå, at skulle lave evt. ændringer flere steder.

Kan jeg ikke lave en stored procedure eller en funktion, som returnerer resultatet af subquery'en? så behøver jeg kun lave mine ændringer i den pågældende stored procedure/funktion.

Og som sagt - så er jeg ret ny, så jeg kan godt bruge nogle eksempler :)
Avatar billede arne_v Ekspert
11. december 2004 - 09:46 #4
Umiddelbart lyder det så som at view som foreslået af trer er det rigtige valg.
Avatar billede bernhof Nybegynder
11. december 2004 - 14:21 #5
Ok, hvis jeg laver et view, hvordan benytter jeg det så i sammenhængen? ..

DELETE FROM tabel WHERE felt IN MyView  -- virker ikke..
Avatar billede a1a1 Novice
11. december 2004 - 14:27 #6
declare @sql varchar(8000)
set @sql = 'select * from orders'
exec(@sql)
exec(@sql)

;o)
Avatar billede a1a1 Novice
11. december 2004 - 14:31 #7
eller en sp

create proc getorderID
@orderID INT
as
declare @sql varchar(8000)
set @sql = 'select * from orders where orderID=' + cast(@orderID as varchar(10))
exec(@sql)
exec(@sql)
go

;o)
Avatar billede bernhof Nybegynder
11. december 2004 - 15:14 #8
Jeg kan nu bedre lide idéen med at placere det i et view :) Men ellers tak for forslaget.
Avatar billede arne_v Ekspert
11. december 2004 - 18:54 #9
DELETE FROM tabel WHERE felt IN (SELECT felt FROM MyView)
Avatar billede bernhof Nybegynder
12. december 2004 - 16:45 #10
Ok, tak for hjælpen!

Hvis arne_v og trer gad lægge et svar, så kan I dele de nu 30 point :)
Avatar billede arne_v Ekspert
12. december 2004 - 16:46 #11
ok
Avatar billede trer Nybegynder
13. december 2004 - 08:30 #12
Lad blot Arne få alle points - det var ham der fulgte dit spørgsmål til dørs.
Avatar billede bernhof Nybegynder
13. december 2004 - 14:05 #13
Ok :)
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