Merge join

giovedì 14 agosto 2008 - 09.53

memmo77 Profilo | Expert

Salve.
Allora io ho due tabelle con la chiave "fk_id_valute" e un valore chiamato "VALUTA". Della prima devo selezionare le valute che, nella seconda tabella, come valore sono diverse da 0, solo che nella seconda non ho tutte le valute ma solo 20 (in totale sono 173). Di queste 20 potrebbero essere valorizzare 1-2-...20 e sulla prima tabella devo selezionare tutte le altre.
L'inner join giustamente mi restituisce quelle che combaciano, in pratica dovrei tirar fuori quelle che non combaciano. (mamma mia che spiegazione ho dato ).
Sapreste dirmi come fare?
Grazie

lbenaglia Profilo | Guru

>Della prima devo selezionare le valute che,
>nella seconda tabella, come valore sono diverse da 0, solo che
>nella seconda non ho tutte le valute ma solo 20 (in totale sono
>173). Di queste 20 potrebbero essere valorizzare 1-2-...20 e
>sulla prima tabella devo selezionare tutte le altre.

Se ho capito bene potresti risolvere in questo modo:

USE tempdb; CREATE TABLE dbo.Valute1( ValutaID int NOT NULL PRIMARY KEY, Valuta smallmoney NOT NULL ); CREATE TABLE dbo.Valute2( ValutaID int NOT NULL PRIMARY KEY, Valuta smallmoney NOT NULL ); INSERT dbo.Valute1 VALUES(1, 10); INSERT dbo.Valute1 VALUES(2, 20); INSERT dbo.Valute1 VALUES(3, 30); INSERT dbo.Valute1 VALUES(4, 40); INSERT dbo.Valute1 VALUES(5, 50); INSERT dbo.Valute1 VALUES(6, 60); INSERT dbo.Valute1 VALUES(7, 70); INSERT dbo.Valute2 VALUES(1, 0); INSERT dbo.Valute2 VALUES(2, 10); INSERT dbo.Valute2 VALUES(3, 0); INSERT dbo.Valute2 VALUES(4, 20); WITH CTE_Valute AS ( SELECT ValutaID FROM dbo.Valute1 EXCEPT SELECT ValutaID FROM dbo.Valute2 WHERE Valuta = 0 ) SELECT V1.* FROM dbo.Valute1 AS V1 JOIN CTE_Valute AS CTE ON V1.ValutaID = CTE.ValutaID; /* Output: ValutaID Valuta ----------- --------------------- 2 20,00 4 40,00 5 50,00 6 60,00 7 70,00 (5 row(s) affected) */ DROP TABLE dbo.Valute1, dbo.Valute2;

>Grazie
Prego.

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

memmo77 Profilo | Expert

Sto provando ad adattare quello che mi hai dato :

--TEMPORANEA
CREATE TABLE #TMP_PROG6 (
FK_ID_AGGR INT
,FK_ID_AGGR_VOCI INT
,T DECIMAL(18,2)
,FK_ID_PAESI_VALUTE SMALLINT
)


-- INSERISCO TUTTI I VALORI NECESSARI
INSERT INTO #TMP_PROG6
SELECT
COMPO.FK_ID_AGGR
,COMPO.FK_ID_AGGR_VOCI
,AGGR_VAL.T
,AGGR_VAL.FK_ID_PAESI_VALUTE
FROM T_VALORI_AGGR AS AGGR_VAL
INNER JOIN T_DIZ_AGGR_COMPOSIZIONI AS COMPO ON
AGGR_VAL.FK_ID_AGGR = COMPO.FK_ID_AGGR_VOCI
WHERE
AGGR_VAL.FK_ID_ABI = '03456'
AND AGGR_VAL.FK_MESE = 3
AND AGGR_VAL.FK_ANNO = 2008
AND COMPO.PROGRESSIVO = 6
AND COMPO.FK_ID_AGGR_VOCI = 7456


WITH CTE_Valute AS
(

SELECT
FK_ID_AGGR
,FK_ID_AGGR_VOCI
,T
,FK_ID_PAESI_VALUTE
FROM #TMP_PROG6

EXCEPT

SELECT
FK_ID_PAESI_VALUTE
FROM T_DIZIONARIO_RACCORDO_PAESI_VALUTE
WHERE
FK_ID_AGGR = 11201
AND FK_ID_PAESI_VALUTE <> 0

)

SELECT V1.*
FROM #TMP_PROG6 AS V1
JOIN CTE_Valute AS CT
ON V1.FK_ID_PAESI_VALUTE = CTE.FK_ID_PAESI_VALUTE

Ma mi torna questo errore:

Messaggio 205, livello 16, stato 1, riga 1
All queries combined using a UNION, INTERSECT or EXCEPT operator must have an equal number of expressions in their target lists.

lbenaglia Profilo | Guru

> SELECT
> FK_ID_AGGR
> ,FK_ID_AGGR_VOCI
> ,T
> ,FK_ID_PAESI_VALUTE
> FROM #TMP_PROG6
>
> EXCEPT
>
> SELECT
> FK_ID_PAESI_VALUTE
> FROM T_DIZIONARIO_RACCORDO_PAESI_VALUTE
> WHERE
> FK_ID_AGGR = 11201
> AND FK_ID_PAESI_VALUTE <> 0
>
>Ma mi torna questo errore:
>
>Messaggio 205, livello 16, stato 1, riga 1
>All queries combined using a UNION, INTERSECT or EXCEPT operator
>must have an equal number of expressions in their target lists.
>

Gli operatori UNION, INTERSECT o EXCEPT richiedono che il numero di colonne specificate nella clausola SELECT sia identico e che il loro data type sia compatibile (implicitamente castabile).
Tu invece cosa hai scritto?
Devi rimuovere le colonne FK_ID_AGGR, FK_ID_AGGR_VOCI e T alla prima select list...

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

memmo77 Profilo | Expert

Allora, adesso funziona. Perfetto, solo che ... se eseguo tutto il codice insieme mi da :

Messaggio 319, livello 15, stato 1, riga 28
Incorrect syntax near the keyword 'with'. If this statement is a common table expression or an xmlnamespaces clause, the previous statement must be terminated with a semicolon.

Se eseguo un pezzo alla volta, prima creo la temporanea, poi la insert e infine il codice che mi hai dato, da questo errore.

lbenaglia Profilo | Guru

>Allora, adesso funziona. Perfetto, solo che ... se eseguo tutto
>il codice insieme mi da :
>
>Messaggio 319, livello 15, stato 1, riga 28
>Incorrect syntax near the keyword 'with'. If this statement is
>a common table expression or an xmlnamespaces clause, the previous
>statement must be terminated with a semicolon.

Gli errori vanno letti.
Che c'è scritto? Il comando precedente alla keyword WITH va terminato con un punto e virgola.
Mettilo, e vedrai che funzionerà.

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

memmo77 Profilo | Expert

Perdonami davvero non avevo letto bene. Scusami e di nuovo grazie mille sei davvero GRANDE . Ciao

lbenaglia Profilo | Guru

>WITH CTE_Valute AS
>(
>
> SELECT
> FK_ID_AGGR
> ,FK_ID_AGGR_VOCI
> ,T
> ,FK_ID_PAESI_VALUTE
> FROM #TMP_PROG6
>
> EXCEPT
>
> SELECT
> FK_ID_PAESI_VALUTE
> FROM T_DIZIONARIO_RACCORDO_PAESI_VALUTE
> WHERE
> FK_ID_AGGR = 11201
> AND FK_ID_PAESI_VALUTE <> 0
>
>)

Ah, lo noto ora: nel primo post dicevi "Della prima devo selezionare le valute che, nella seconda tabella, come valore sono diverse da 0" che equivale a dire escludere dalla seconda tabella le righe con valuta uguale a 0.
Bene, hai appena scritto il contrario
Osserva bene il mio esempio...

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

memmo77 Profilo | Expert

Sisi ma avevo bisogno del contrario ho scritto male all'inizio . Mi ero confuso io.

memmo77 Profilo | Expert

Funziona funziona ora provo ad aggiungere un fetch per ciclare la mia tabella tmp e fare gli update . Grazie di nuovo
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-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5