Riutilizzo record per un'altra select

mercoledì 03 febbraio 2010 - 17.09

trinity Profilo | Guru

Salve ragazzi,
spero di spiegarmi bene...in pratica io ho creato una stored che soddisfa il risultato che mi restituisce...ora da questi record che ottengo dalla stored, dovrei riutilizzare due campi che rappresentanto degli indici di ricerca per esegui un'altra select in una tebella diversa da quella che viene utilizzata dalla stored sopracitata.
Mi spiego meglio...in pratica io ho questa sintassi:

ALTER PROCEDURE [dbo].[GetRitardi_new] ( @data1 as Datetime, @data2 as Datetime ) AS BEGIN SELECT alb.codalb, alb.descrizione, alb.codcomune, alb.Tel FROM dbo.albergo as alb JOIN dbo.Apertura_chiusura as Ap ON alb.Codalb=Ap.codalbergo and alb.CodComune=Ap.codcomune Where Ap.Datafineattivita='9999-01-01' and (datatemp1='9999-01-01' or (datatemp1 > @data1 and datatemp2>=@data2) or (datatemp1<=@data1 and datatemp2<@data2))and (data1='9999-01-01' or (data1 > @data1 and data2>=@data2) or (data1<=@data1 and data2<@data2)) and (data3='9999-01-01' or (data3 > @data1 and data4>=@data2) or (data3<=@data1 and data4<@data2)) and (data5='9999-01-01' or (data5 > @data1 and data6>=@data2) or (data5<=@data1 and data6<@data2)) and (data7='9999-01-01' or (data7 > @data1 and data8>=@data2) or (data7<=@data1 and data8<@data2)) Order by codalbergo,codcomune END
in base a dei dati che ho nelle tabelle (che non vi sto a postare) ottengo come risultato un esempio del genere:

codalbergo descrizione codcomune
2 ALBERGO PROVA2 59032
3 ALBERGO PROVA3 59032

adesso io devo utilizzare il valori codalbergo e codcomune per selezionare dei dati in un'altra tabella.Ovviamente prima per l'albergo prova2 e poi per prova3..in prativa dovrei come per esempio eseguire un ciclo.

Pensavo all'inizio di creare un'unica stored con i cursori ed una tabella temporanea, però a differenza di altre volte che ho utilizzato i cursori ora nn saprei proprio come partire.

Avete qualche suggerimento?
Grazie
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

alx_81 Profilo | Guru

>Salve ragazzi,
Ciao

>spero di spiegarmi bene...in pratica io ho creato una stored
>che soddisfa il risultato che mi restituisce...ora da questi
>record che ottengo dalla stored, dovrei riutilizzare due campi
>che rappresentanto degli indici di ricerca per esegui un'altra
>select in una tebella diversa da quella che viene utilizzata
>dalla stored sopracitata.
>Mi spiego meglio...in pratica io ho questa sintassi:
eheh, mi sembra di averla già letta poco fa in un altro post

>2 ALBERGO PROVA2 59032
>3 ALBERGO PROVA3 59032
>adesso io devo utilizzare il valori codalbergo e codcomune per
>selezionare dei dati in un'altra tabella.Ovviamente prima per
>l'albergo prova2 e poi per prova3..in prativa dovrei come per
>esempio eseguire un ciclo.
>Pensavo all'inizio di creare un'unica stored con i cursori ed
>una tabella temporanea, però a differenza di altre volte che
>ho utilizzato i cursori ora nn saprei proprio come partire.
>Avete qualche suggerimento?
potresti fare in modo che il resultset che ricavi sia una subquery (ad esempio potresti metterla in una CTE, common table expression) e che tale subquery sia in join con l'altra tabella in base ai campi per cui ti serve il legame. In questo modo otterrai i risultati per i tuoi alberghi e potrai ordinarli successivamente per ottenere il resultset finale come ti serve. In teoria verrebbe una cosa tipo:

;WITH alberghi_step1 AS ( -- tua select definita nella stored procedure di cui parlavi prima ) SELECT campi FROM alberghi_step1 A JOIN altra_tabella B ON A.codalb = B.codalb ORDER BY A.codalb

questo a titolo di esempio. Insomma, il concetto è, metti la tua query come sottoquery e poi ponila in join con la tabella ulteriore, evitando cicli o cursori, che, nella maggior parte dei casi, puoi evitare dando spazio a soluzioni set based.

>Grazie
di nulla!
--

Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

trinity Profilo | Guru

E funziona solo che non mi da il risultato che voglio...ti spiego ecco la stored modificata:

ALTER PROCEDURE [dbo].[GetRitardi_new] ( @data1 as Datetime, @data2 as Datetime ) AS BEGIN WITH alberghi_step1 AS ( SELECT alb.codalb, alb.descrizione, alb.codcomune, alb.Tel FROM dbo.albergo as alb JOIN dbo.Apertura_chiusura as Ap ON alb.Codalb=Ap.codalbergo and alb.CodComune=Ap.codcomune Where Ap.Datafineattivita='9999-01-01' and (datatemp1='9999-01-01' or (datatemp1 > @data1 and datatemp2>=@data2) or (datatemp1<=@data1 and datatemp2<@data2))and (data1='9999-01-01' or (data1 > @data1 and data2>=@data2) or (data1<=@data1 and data2<@data2)) and (data3='9999-01-01' or (data3 > @data1 and data4>=@data2) or (data3<=@data1 and data4<@data2)) and (data5='9999-01-01' or (data5 > @data1 and data6>=@data2) or (data5<=@data1 and data6<@data2)) and (data7='9999-01-01' or (data7 > @data1 and data8>=@data2) or (data7<=@data1 and data8<@data2)) ) SELECT A.Codalb,A.Descrizione,A.CodComune,A.Tel FROM alberghi_step1 A Left JOIN dbo.Notifiche N ON A.codalb = N.codalbergo and A.Codalb=N.codcomune Where N.datanotifica Not Between @data1 and @data2 ORDER BY A.codalb,A.CodComune END

in pratica ti spiego quelloche mi serve: Allora la prima select serve a vedere in base alle date che io passo quali strutture sono aperte oppure no. Il risultato mi da le strutture aperte, poi queste strutture devo essere analizzate nella tabella notifiche ossia se una struttura è aperta deve scrivere delle notifiche. a me serve con la seconda select prendere le strutture aperte che non hanno scritto nessuna notifica. ogni struttura che scrive una notifica viene registrata la data del mese di riferimento sempre il primo dii ogni mese..pertanto pensavo di gestire la seconda select con una between e prendere tutti i record che non rientrano nel periodo indicato...

esempio la prima select mi restituisce i seguneti alberghi:

codalb codcomune descrizione
1 59032 albergo1
3 59032 albergo3

ora l'albergo1 nel periodo dal:01-02-2010 al:28-02-2010 inserisce una notifica...pertanto il risultato finale della stored mi dovrebbe solo rilevare l'albergo3 che non ha inserito nessuna notifica.

Con la stored che ho postato ora questo non funziona. Dove sbaglio?

Ciao
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5