Una sotred con all'interno due select in due tabelle diverse.

venerdì 03 ottobre 2008 - 10.57

trinity Profilo | Guru

Buongiorno a tutti,

allora in pratica io ho creato una taabella dati e una identica tabella datistorici.

In una stored creo una select che mi va a prelevare i record nella tabella "dati", solo che io vorrei che nel caso la select non mi restituisce record, sempre nella stored si passa ad eseguire la select che preleva i dati dalla tabella "datistorici"

come posso fare?

Ciao
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

ale.orma Profilo | Junior Member

Definisci una tabella temporanea con struttura uguale a quella della tabella DATI, poi puoi usare la variabile @@rowcount che restituisce il numero di righe ottenute dalla prima query in questo modo:

create table #myresult ( col 1, col 2, ....... col n) insert #myresult select * from DATI if @@rowcount=0 begin insert #myresult select * from DATISTORICI end select * from #myresult

trinity Profilo | Guru

Aspetta facciamo le cose per benino,

allora ecco le due tabelle reali:


Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra


ora supponiamo che nella tabella Archivio_mov_new ci siano i seguenti dati:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra


mentre nell'archiviostorico_mov_new abbiamo i seguenti dati:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra


Ora io se eseguo una select sull'archivio_mov_new di questo tipo:

Select * From Archivio_mov_new where codalbergo=48 and codcomalbergo=60035 and dataarrivo between '20081001' and '20081031'

avremo come risultato il seguente schema:

1,5,48,60035,20081001,20081002,ITALIA 2,5,48,60035,20081001,20081002,ITALIA 3,5,48,60035,20081001,20081002,ITALIA 4,5,48,60035,20081001,20081002,ITALIA 5,5,48,60035,20081001,20081002,ITALIA 5,5,48,60035,20081002,20081003,FRANCIA 5,5,48,60035,20081002,20081003,FRANCIA

ora se io invece volessi fare vari casi di select tipo:


Select * From Archivio_mov_new where codalbergo=48 and codcomalbergo=60035 and dataarrivo between '20080901' and '20080930'

allora non essendoci dati nella tabella archivio_mov_new deve essere eseguita una select nella tabella storico.

ma se invece io andassi a scrivere una select del genere:


Select * From Archivio_mov_new where codalbergo=48 and codcomalbergo=60035 and dataarrivo between '20080901' and '20081031'


allora si deve eseguire una selezione che prenda i dati della tabella storico + i dati della tabella attuale


Ecco cosa mi serve.

Ciao



Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

lbenaglia Profilo | Guru

>Ecco cosa mi serve.

Scusami Fabio,

Ma non è sufficiente unire le due tabelle mediante l'operatore UNION ALL?

USE tempdb; CREATE TABLE dbo.Archivio_mov_new( IdDb bigint IDENTITY(1,1) NOT NULL, progschedina int NULL, codalbergo int NULL, codcomalbergo int NULL, DataArrivo smalldatetime NULL, DataPartenza smalldatetime NULL, StatoResidenza varchar(10) NULL, CONSTRAINT PK_Archivio_mov_new PRIMARY KEY(IdDb) ); CREATE TABLE dbo.ArchivioStorico_mov_new( IdDb bigint IDENTITY(1,1) NOT NULL, progschedina int NULL, codalbergo int NULL, codcomalbergo int NULL, DataArrivo smalldatetime NULL, DataPartenza smalldatetime NULL, StatoResidenza varchar(10) NULL, CONSTRAINT PK_ArchivioStorico_mov_new PRIMARY KEY(IdDb) ); INSERT dbo.Archivio_mov_new VALUES(5, 48, 60035, '20081001', '20081002', 'ITALIA'); INSERT dbo.Archivio_mov_new VALUES(5, 48, 60035, '20081001', '20081002', 'ITALIA'); INSERT dbo.Archivio_mov_new VALUES(5, 48, 60035, '20081001', '20081002', 'ITALIA'); INSERT dbo.Archivio_mov_new VALUES(5, 48, 60035, '20081001', '20081002', 'ITALIA'); INSERT dbo.Archivio_mov_new VALUES(5, 48, 60035, '20081001', '20081002', 'ITALIA'); INSERT dbo.Archivio_mov_new VALUES(6, 48, 60035, '20081002', '20081003', 'FRANCIA'); INSERT dbo.Archivio_mov_new VALUES(6, 48, 60035, '20081002', '20081003', 'FRANCIA'); INSERT dbo.ArchivioStorico_mov_new VALUES(1, 48, 60035, '20080928', '20080929', 'GERMANIA'); INSERT dbo.ArchivioStorico_mov_new VALUES(2, 48, 60035, '20080928', '20080929', 'GERMANIA'); INSERT dbo.ArchivioStorico_mov_new VALUES(3, 48, 60035, '20080929', '20080930', 'GERMANIA'); INSERT dbo.ArchivioStorico_mov_new VALUES(4, 48, 60035, '20080929', '20080930', 'GERMANIA'); WITH CTE_Archivio AS ( SELECT * FROM dbo.Archivio_mov_new UNION ALL SELECT * FROM dbo.ArchivioStorico_mov_new ) SELECT * FROM CTE_Archivio WHERE codalbergo = 48 AND codcomalbergo = 60035 AND dataarrivo BETWEEN '20080901' AND '20081031'; DROP TABLE dbo.Archivio_mov_new, dbo.ArchivioStorico_mov_new;

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

ale.orma Profilo | Junior Member

Allora se ho ben capito i casi sono 2:
A) la query su archivio_mov_new NON RESTITUISCE righe --> deve essere eseguita una select nella tabella ArchivioStorico_mov_new.
B) la query su archivio_mov_new RESTITUISCE righe --> si deve eseguire una selezione che prenda i dati della tabella storico + i dati della tabella attuale
Quindi la lettura sulla tabella ArchivioStorico_mov_new va sempre fatta e non SOLO SE la prima query non dà risultati.
Basta quindi mettere in UNION ALL le due query come suggerisce lbenaglia...

lbenaglia Profilo | Guru

>Non ti basta quindi mettere in UNION ALL le due query?
E io che ho scritto?

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

trinity Profilo | Guru

Grazie mille

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-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5