27 messaggi dal 21 maggio 2003
Ciao a tutti ragazzi, ho il seguente problema con Mysql.

Ho due tabelle collegate tramite codice_fiscale

tabella A con i campi id_tabellaa, nome, cognome, codice_fiscale

tabella B con i campi id_tabellab, codice_fiscale, voto, credito

devo selezionare tutti i campi di a che hanno una corrispondenza in b, ma anche tutti quelli di a che non hanno corrispondenza in b.

Fin qui tutto ok con una left join.

Però io devo selezionare tutti i campi di a che hanno credito=3. Ovviamente mettendo la condizione non tutti i campi di a saranno selezionati se non soddisfano la condizione. Avevo allora messo nella condizione isnull(voto) or giornata=3 e con i record con tutti i campi giornata=1 andava benone. Però se nella tabella b un codice fiscale è presente con giornata=1 ma non con giornata=3 questo non viene selezionato.

Non so se sono stato chiaro.
1.976 messaggi dal 27 luglio 2005
Contributi
salve,
luicut ha scritto:

Non so se sono stato chiaro.


assolutamente NO

Però io devo selezionare tutti i campi di a che hanno credito=3. Ovviamente mettendo la condizione non tutti i campi di a saranno selezionati se non soddisfano la condizione. Avevo allora messo nella condizione isnull(voto) or giornata=3 e con i record con tutti i campi giornata=1 andava benone. Però se nella tabella b un codice fiscale è presente con giornata=1 ma non con giornata=3 questo non viene selezionato.


hai mischiato "giornata" e "credito" ed hai aggiunto anche un bel "Voto IS NULL" in modo che personalmente non ho piu' capito niente... sara' magari anche l'ora

personalmente non conosco e non uso MySql.. ma penso che tu possa usare la stessa sintassi di JOIN anche con questo motore..

se ho "capito" il tuo problema (facciamo finta di si  ), puoi modificare il filtro di JOIN (almeno con SQL Server) in modo reinserire nel risultato quello che differentemente verrebbe omesso dalla clausola WHERE...

SET NOCOUNT ON;
CREATE TABLE #tA (
Id int NOT NULL,
Nome varchar(10),
Cognome varchar(10),
CodiceFiscale char(16)
);
CREATE TABLE #tB (
Id int NOT NULL,
CodiceFiscale char(16),
Voto int,
Credito int,
Giornata int
);
GO
INSERT INTO #tA VALUES ( 1 , 'Luicut', 'Luicut', '1234567890123456');
INSERT INTO #tA VALUES ( 2 , 'Andrea', 'Andrea', '2345678901234567');

INSERT INTO #tB VALUES ( 1 , '1234567890123456', NULL, 3, 1); -- si
INSERT INTO #tB VALUES ( 2 , '1234567890123456', NULL, 3, 3); -- si
INSERT INTO #tB VALUES ( 3 , '1234567890123456', -1, 3, 3); -- si
INSERT INTO #tB VALUES ( 4 , '1234567890123456', -1, 2, 3); -- no
GO
SELECT *
FROM #tA a LEFT JOIN #tB b
ON a.CodiceFiscale = b.CodiceFiscale
AND b.Credito = 3;
GO
DROP TABLE #tA, #tB;
--<----------
Id Nome Cognome CodiceFiscale Id CodiceFiscale Voto Credito Giornata
----------- ---------- ---------- ---------------- ----------- ---------------- ----------- ----------- -----------
1 Luicut Luicut 1234567890123456 1 1234567890123456 NULL 3 1
1 Luicut Luicut 1234567890123456 2 1234567890123456 NULL 3 3
1 Luicut Luicut 1234567890123456 3 1234567890123456 -1 3 3
2 Andrea Andrea 2345678901234567 NULL NULL NULL NULL NULL

ripeto, pero', che il discorso non l'ho mica capito tanto bene..

saluti

Andrea Montanari
http://www.hotelsole.com - http://www.hotelsole.com/asql/index.php
27 messaggi dal 21 maggio 2003
Grazie andrea ho seguito il tuo consiglio e funziona tutto bene... non sapevo delle condizioni nel join

Grazie mille
1.976 messaggi dal 27 luglio 2005
Contributi
salve,
luicut ha scritto:
Grazie andrea ho seguito il tuo consiglio e funziona tutto bene... non sapevo delle condizioni nel join

Grazie mille

in effetti e' una sintassi spesso sotto usata...
FROM tabellaA a LEFT JOIN tabellaB b -- sicuramente tutte le righe di A
ON a.joinCol = b.joinCol -- e fino a qui, ci siamo
AND b.colX = condizione -- inserisce nella worktable le righe di [b] addizionali, oltre chiaramente a mantenere le outer rows di [a]

-- WHERE b.colX = condizione -- farebbe invece si' che le righe di [a] non presenti in [b] arebbero nuovamente escluse visto che la relativa prodotto cartesiano risulterebbe in NULL nella propiezione, quindi necessariamente (NULL <> condizione), visto che viene valutata dopo la generazione della work table risultante dalla join stessa..

saluti

Andrea Montanari
http://www.hotelsole.com - http://www.hotelsole.com/asql/index.php

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.