348 messaggi dal 10 marzo 2013
Questo è quello che intendevo.
La domanda è:

Secondo voi è un modo giusto di ottenere i campi NULL o potrebbe crearmi dei problemi?

Posto il codice :

SELECT TOP (100) PERCENT dbo.T_Professional.IdProfessional, dbo.T_Professional.P_Cognome, dbo.T_Professional.P_Nome, dbo.T_Professional.P_DataNascita,
dbo.T_Professional.IdBrevetto, dbo.T_Brevetti.Descrizione, T_Professional_1.P_Cognome AS SurnameInstr, T_Professional_1.P_Nome AS NameInstr,
dbo.T_Professional.P_CodiceIcd, dbo.T_EsaPoint.RagioneSociale
FROM dbo.T_Professional LEFT OUTER JOIN
dbo.T_Brevetti ON dbo.T_Professional.IdBrevetto = dbo.T_Brevetti.IdBrevetto LEFT OUTER JOIN
dbo.T_Professional AS T_Professional_1 ON dbo.T_Professional.P_CodiceIcd = T_Professional_1.IdProfessional LEFT OUTER JOIN
dbo.T_EsaPoint ON dbo.T_Professional.IdEsaPoint = dbo.T_EsaPoint.IDEsaPoint
ORDER BY dbo.T_Professional.IdProfessional

Grazie
1.976 messaggi dal 27 luglio 2005
Contributi
salve,
scusa ma continuo a non comprendere la tua problematica...

tu effettui una LEFT OUTER JOIN, quindi tutte le righe di dbo.T_Professional vengono proiettate a prescindere che righe di dbo.T_Brevetti le referenzino... in caso di mancato riferimento, tutti le colonne proiettate derivanti dalla tabella dbo.T_Brevetti saranno NULL...
saranno ovviamente escluse le righe di dbo.T_Brevetti dove non viene soddisfatta la relazione
T_Professional.IdBrevetto = dbo.T_Brevetti.IdBrevetto
, ad esempio dove dbo.T_Brevetti.IdBrevetto = NULL

tutto cio' pero' non mi pare rispondere alla tua domanda che, ripeto, purtroppo non riesco a comprendere...
saluti

Andrea Montanari
http://www.hotelsole.com - http://www.hotelsole.com/asql/index.php
348 messaggi dal 10 marzo 2013
Il mio problema era il seguente: non riuscivo a visualizzare i campi Null, e non sono stato in grado di trovare una soluzione se non quella di usare left outer join che, per quanto ne capisco io ( purtroppo ancora ben poco) , sembrava soddisfare la mia esigenza. Provando a fare come mi aveva detto giufrixyz , non riuscivo ad ottenere il risultato che desideravo, ( sicuramente stavo sbagliando qualcosa). Se nella query mostrata prima, io uso inner join e poi filtro usando idbrevetto is null, non ottengo nessun record.

Volevo sapere: qual è il metodo giusto o meglio , la mia richiesta e' proprio da ignorante in materia: mi potete mostrare nel modo piu semplice che conoscete ad ottenere dalla mia query anche i campi null?

Spero di essere riuscito a spiegarmi bene.
Nel caso vi chiedo di avere pazienza e di continuare a sopportarmi.
Grazie infinite.
72 messaggi dal 04 agosto 2008
Ciao,
direi che la prima domanda sembrava significare qualcosa di diverso ma ora mi pare chiaro che la soluzione da te trovata sia quella corretta proprio nel senso spiegato da Andrea Montanari.
Direi che la query non sembra neanche banalissima... generalmente si comprendono prima le left outer join e poi le self join; quest'ultima mi pare applicata correttamente.
Buon divertimento!
s
1.976 messaggi dal 27 luglio 2005
Contributi
salve,
non e' un problema di "sopportarti".... per me continua ad essere un problema di capire... sai, comincio ad avere una certa eta' :)

cerco di spiegarmi per quello che ho capito... e concedimi la liberta' di essere pedante... :)

trivialmente, un'operazione di JOIN effettua una relazione tra 2 tabelle... tipicamente una colonna della tabella referenziante punta ad una colonna della tabella referenziata... cioe' ad esempio, la tabella {dettaglio_riga: IdFattura} di una fattura punta alla tabella {fattura: IdFattura} che ne costrituisce l'intestazione, ponendo la relazione tra dettaglio_riga.IdFattura = fattura.Id
il tipo base di JOIN, l'equi join INNER JOIN, prevede che la condizione debba essere soddisfatta da entrambe le parti della relazione e devono quindi esistere nella proiezione finale sia righe referenziate a destra che righe referenzianti a sinistra della relazione.... tipicamente verranno proiettate righe complete che abbiano sia un'intestazione di fattura che righe di fattura stessa, e la proiezione sara' completa...
l'OUTER JOIN invece concede una diversa liberta'... esiste nelle formulazioni { LEFT | RIGHT | FULL } e permette che, nel nostro caso, con LEFT OUTER JOIN, vengano restituite sia le relazioni complete fattura<->righe_fattura (cioe' fatture che abbiano righe di dettaglio) che righe relative a fatture che non abbiano alcun dettaglio...
la formulazione di RIGHT OUTER JOIN consente la proiezione invece sia delle relazioni complete fattura<->righe_fattura (cioe' fatture che abbiano righe di dettaglio) che righe relative a dettaglio di fatture che non abbiano alcuna intestazione fattura [chiaramente questo esempio non dovrebbe essere tecnicamente possibile, ma la realta' tante volte supera la fantasia :) ]...
l'ultima formulazione, FULL OUTER JOIN, permette la "somma" di LEFT e RIGHT OUTER JOIN... viene quindi proiettato "tutto"...
nel primo caso, LEFT OUTER JOIN, nel caso di "assenza" di corrispondenza, e quindi in presenza di intestazioni di fattura senza alcun dettaglio di riga, la proiezione non potendo recuperare dati per la tabella dettaglio_righe, provvedera' a sostituire i valori relativi alle colonne proiettate con NULL, che in questo caso effettivamente significa "ASSENZA DI VALORE IN ASSOLUTO e non relativa sostituzione"...
nel caso ri RIGHT OUTER JOIN, la sostituzione in proiezione avverra' dove esistano righe di dettaglio_righe che referenzino NESSUNA fattura...
il FULL OUTER JOIN, esegue la "somma" delle 2 varianti sopra indicate... potranno quindi esistere righe valorizzate con NULL nell'intestazione e righe valorizzate con NULL nelle colonne relative al dettaglio, oltre che ovviamente le righe dove la relazione sia soddisfatta...

per questo motivo continuo a non capire e a chiederti quale sia il tuo problema con i NULL...
saluti
Modificato da Andrea Montanari il 10 settembre 2014 23.15 -

Andrea Montanari
http://www.hotelsole.com - http://www.hotelsole.com/asql/index.php
348 messaggi dal 10 marzo 2013
Il problema non e' la tua eta ,ma la mia conoscenza dell'argomento.
Tu hai dalla tua l'esperienza :)

Allora, ci riprovo:

SELECT TOP (100) PERCENT dbo.T_Professional.IdProfessional, dbo.T_Professional.P_Cognome, dbo.T_Professional.P_Nome, dbo.T_Professional.P_DataNascita,
dbo.T_Professional.IdBrevetto, dbo.T_Brevetti.Descrizione, T_Professional_1.P_Cognome AS SurnameInstr, T_Professional_1.P_Nome AS NameInstr,
dbo.T_Professional.P_CodiceIcd, dbo.T_EsaPoint.RagioneSociale
FROM dbo.T_Professional INNER JOIN
dbo.T_Brevetti ON dbo.T_Professional.IdBrevetto = dbo.T_Brevetti.IdBrevetto INNER JOIN
dbo.T_Professional AS T_Professional_1 ON dbo.T_Professional.P_CodiceIcd = T_Professional_1.IdProfessional INNER JOIN
dbo.T_EsaPoint ON dbo.T_Professional.IdEsaPoint = dbo.T_EsaPoint.IDEsaPoint
ORDERBY dbo.T_Professional.IdProfessional

Questa query la ottengo lavorando con le viste di SQL.
In questo database ho 1474 record che, vengono visualizzati tutti fino a quando non chiedo di restituirmi anche la ragione sociale, una volta che effettuo questa richiesta , vengono fuori 952 record.
Nella mia ricerca per capire quale fosse il problema, ho notato che i record che non mi venivano restituiti avevano la ragione sociale con valore null. Ed erano circa 500 esattamente quelli che mi mancavano.
Ho pensato dunque (forse erroneamente )che, dovevo includere nella mia richiesta anche la restituzione dei campi null.
Ed e' così che e' nato il mio problema.

Spero di essere stato più' chiaro.
Ma comunque non e' colpa tua.

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.