Telefonino.net network
 
| HOMEPAGE | INDICE FORUM | REGOLAMENTO | ::. NEI PREFERITI .:: | RSS Forum | RSS News | NEWS web | NEWS software |
| PUBBLICITA' | | ARTICOLI | WIN XP | VISTA | WIN 7 | REGISTRI | SOFTWARE | MANUALI | RECENSIONI | LINUX | HUMOR | HARDWARE | DOWNLOAD | | CERCA nel FORUM » |

Torna indietro   WinTricks Forum > Software > Programmazione

Notices

Rispondi
 
Strumenti discussione
Vecchio 25-11-2009, 11.27.46   #1
rgrd
Newbie
 
Registrato: 23-12-2005
Loc.: Tirano
Messaggi: 9
rgrd promette bene
Visualizzazione record nulli SQL

Ciao a tutti!!!!
Ho un problema che non riesco a risolvere: sto facendo un'interrogazione sql che comprende diversi campi presi da tabelle diverse, e fin qui tutto bene
Il problema giunge nel momento in cui incontro un campo vuoto: quando mi capita questa cosa tutte le righe della mia query che contengono quel campo non vengono più visualizzate, perchè il join tra la tabella che contiene il campo vuoto e la tabella primaria non viene più soddisfatto.
Ora, è possibile riuscire a bypassare questo problema, ovvero farmi visualizzare tutti i campi, anche quelli vuoti, indipendentemente dal fatto che lo sono, cosicchè io non perda la visualizzazione dei campi valorizzati?
La query su cui sto lavorando è questa:

SELECT
[MA_CustSupp].[CompanyName],[MA_SaleOrdDetails].[Item],[MA_SaleOrdDetails].[Description], COUNT([MA_SaleOrdDetails].[Qty]) AS 'Ordinato_cliente', COUNT([MA_PurchaseOrdDetails].[Qty]) AS 'Ordinato_fornitore', COUNT([MA_PurchaseDocDetail].[Qty]) AS 'Bolla_carico'
FROM
[MA_CustSupp], [MA_SaleOrdDetails], [MA_ItemsGoodsData], [MA_PurchaseOrdDetails], [MA_PurchaseDocDetail]
WHERE
[MA_SaleOrdDetails].[Item]=[MA_ItemsGoodsData].[Item]
AND
[MA_ItemsGoodsData].[Supplier]=[MA_CustSupp].[CustSupp]
AND
[MA_PurchaseOrdDetails].[Item]=[MA_SaleOrdDetails].[Item]
AND
[MA_PurchaseDocDetail].[Item]=[MA_SaleOrdDetails].[Item]
GROUP BY
[MA_CustSupp].[CompanyName],[MA_SaleOrdDetails].[Item],[MA_SaleOrdDetails].[Description]

Quando tutti i campi sono diversi da null mi vengono visualizzati tutti i valori, quando un campo della riga è null perdo la visualizzazione della riga, io voglio visualizzare la riga e voglio che mi venga restituito il valore null da sql server.
E' possibile??

Scusate il casino ma non so più neanche io come mi chiamo.

Grazie anticipatamente a chi riuscirà ad aiutarmi...
rgrd non è collegato   Rispondi citando
Vecchio 25-11-2009, 11.48.11   #2
P8257 WebMaster
Gold Member
 
Registrato: 07-01-2002
Loc.: Milano
Messaggi: 2.863
P8257 WebMaster promette bene
Devi usare 'left outer join' o 'right outer join' dipendentemente da quale tabella vuoi mettere in unione non esclusiva partendo da sinistra.

Ti faccio un esempio di query:
con 2 tabelle ipotetiche dove hai dati del cliente e dati di un prodotto messe in join

Codice:
SELECT c.Nome, c.Cognome, P.Nome_prodotto
           FROM Clienti AS C
           LEFT OUTER JOIN Prodotti AS P
                ON C.id_prodotto = P.id
In questo caso dove 'P.Id' non avrà corrispondenza, sql visualizzerà comunque la riga della tabella C ma riportando NULL nel campo corrispondente.

La sintassi da te usate è un'implicita INNER JOIN il che significa che non vengono visualizzate le righe che non soddisfano tute le condizioni di join.

Query di base:
Codice:
SELECT <campi_resultset>
          FROM <tabella base>
          [LEFT] [RIGHT] [CROSS] [INNER] [OUTER] JOIN <tabella2>
                      ON <tabella_base.NomeCampo> [=] [<>] <tabella2.NomeCampo>
                      [AND <condizioni aggiuntive di join]

          [WHERE <condizione di where>]
P8257 WebMaster non è collegato   Rispondi citando
Vecchio 25-11-2009, 11.54.38   #3
rgrd
Newbie
 
Registrato: 23-12-2005
Loc.: Tirano
Messaggi: 9
rgrd promette bene
Grazie per la risposta, provo subito....
rgrd non è collegato   Rispondi citando
Vecchio 25-11-2009, 12.04.56   #4
rgrd
Newbie
 
Registrato: 23-12-2005
Loc.: Tirano
Messaggi: 9
rgrd promette bene
Ho modificato la query così:

SELECT
[MA_CustSupp].[CompanyName],[MA_SaleOrdDetails].[Item],[MA_SaleOrdDetails].[Description], COUNT([MA_SaleOrdDetails].[Qty]) AS 'Ordinato_cliente', COUNT([MA_PurchaseOrdDetails].[Qty]) AS 'Ordinato_fornitore', COUNT([MA_PurchaseDocDetail].[Qty]) AS 'Bolla_carico'
FROM
[MA_CustSupp], [MA_SaleOrdDetails], [MA_ItemsGoodsData], [MA_PurchaseOrdDetails], [MA_PurchaseDocDetail]
WHERE
[MA_SaleOrdDetails].[Item]=[MA_ItemsGoodsData].[Item]
AND
[MA_ItemsGoodsData].[Supplier]=[MA_CustSupp].[CustSupp]
AND
[MA_PurchaseOrdDetails].[Item]=[MA_SaleOrdDetails].[Item]
AND LEFT OUTER JOIN [MA_PurchaseDocDetail] ON
[MA_SaleOrdDetails].[Item]=[MA_PurchaseDocDetail].[Item]
GROUP BY
[MA_CustSupp].[CompanyName],[MA_SaleOrdDetails].[Item],[MA_SaleOrdDetails].[Description]

SQL Server però mi restituisce questo errore:

Messaggio 156, livello 15, stato 1, riga 11
Incorrect syntax near the keyword 'OUTER'.

Cosa sbaglio???



Grazie ancora.....
rgrd non è collegato   Rispondi citando
Vecchio 25-11-2009, 12.07.26   #5
P8257 WebMaster
Gold Member
 
Registrato: 07-01-2002
Loc.: Milano
Messaggi: 2.863
P8257 WebMaster promette bene
E' sbagliata la sintassi .. ti posto la query corretta....
P8257 WebMaster non è collegato   Rispondi citando
Vecchio 25-11-2009, 12.08.36   #6
rgrd
Newbie
 
Registrato: 23-12-2005
Loc.: Tirano
Messaggi: 9
rgrd promette bene
grazie....
rgrd non è collegato   Rispondi citando
Vecchio 25-11-2009, 12.23.43   #7
P8257 WebMaster
Gold Member
 
Registrato: 07-01-2002
Loc.: Milano
Messaggi: 2.863
P8257 WebMaster promette bene
L'idea è questa .. non l'ho provata ma se non ho invertito le tabelle e non mi sono fumato qualche virgola o roba simile dovrebbe andare.. nota l'utilizzo degli alias che semplificano la vita e disambiguano la query aiutando il motore di database nel distinguere le tabelle. Controlla anche le relazioni di join, mi sembra di capire che hai tutte inner esclusive e una sola outer, per aprire le condizioni converti le inner in outer e i record ti verranno restituiti anche se non c'é un legame esclusivo.

Codice:
SELECT
	T1.[CompanyName],
	T3.[Item],
             [T3].[Description], 
             COUNT(T5.[Qty]) AS 'Ordinato_cliente', 
             COUNT(T4.[Qty]) AS 'Ordinato_fornitore', 
             COUNT(T4.[Qty]) AS 'Bolla_carico'
	FROM [MA_CustSupp] AS T1
	INNER JOIN [MA_ItemsGoodsData] AS T2
	   ON T2.[Supplier]=T1.[CustSupp]
	INNER JOIN [MA_SaleOrdDetails] AS T3
	   ON T3.[Item] = T2.[Item]
	INNER JOIN [MA_PurchaseOrdDetails] AS T4
	   ON T4.[Item] = T3.[Item]
	LEFT OUTER JOIN [MA_SaleOrdDetails] AS T5
	   ON T5.[Item] = T4.[Item]
	GROUP BY
		T1.[CompanyName],T3.[Item],T3.[Description

Ultima modifica di P8257 WebMaster : 25-11-2009 alle ore 12.31.11
P8257 WebMaster non è collegato   Rispondi citando
Vecchio 25-11-2009, 12.34.15   #8
rgrd
Newbie
 
Registrato: 23-12-2005
Loc.: Tirano
Messaggi: 9
rgrd promette bene
Dunque, mi restituisce un po' di errori, ma forse perchè io non sono stato chiaro.... La tabella [MA_CustSupp] non è la tabella principale; la tabella principale è [MA_SaleOrdDetails], che è quella che mi determina la visualizzazione dei campi....Partendo dalla logica che mi hai consigliato provo a sviluppare la query secondo il mio filo mentale... se avessi ancora problemi provo a riscriverti...
Grazie mille
rgrd non è collegato   Rispondi citando
Vecchio 25-11-2009, 12.37.25   #9
P8257 WebMaster
Gold Member
 
Registrato: 07-01-2002
Loc.: Milano
Messaggi: 2.863
P8257 WebMaster promette bene
Si ovviamente l'ho scritta alla cieca partendo dall'ordine in cui avevi messo le tabelle nel from .. ricostruisci il filo logico della query con le tabelle ordinate e questa sintassi.
P8257 WebMaster non è collegato   Rispondi citando
Vecchio 25-11-2009, 12.43.24   #10
rgrd
Newbie
 
Registrato: 23-12-2005
Loc.: Tirano
Messaggi: 9
rgrd promette bene
Sei un genio, ho riordinato le tabelle e sistemato due cose e ora tutto funziona perfettamente, posto il codice corretto:
Quota:
SELECT
T1.[CompanyName],
T3.[Item],
[T3].[Description],
COUNT(T3.[Qty]) AS 'Ordinato_cliente',
COUNT(T4.[Qty]) AS 'Ordinato_fornitore',
COUNT(T5.[Qty]) AS 'Bolla_carico'
FROM [MA_CustSupp] AS T1
INNER JOIN [MA_ItemsGoodsData] AS T2
ON T2.[Supplier]=T1.[CustSupp]
INNER JOIN [MA_SaleOrdDetails] AS T3
ON T3.[Item] = T2.[Item]
INNER JOIN [MA_PurchaseOrdDetails] AS T4
ON T4.[Item] = T3.[Item]
LEFT OUTER JOIN [MA_PurchaseDocDetail] AS T5
ON T5.[Item] = T3.[Item]
GROUP BY
T1.[CompanyName],T3.[Item],T3.[Description]
Mi devo aggiornare... sono rimasto al vecchio metodo join usato dall'sql... La sintassi che mi hai proposto per me è più complessa da capire, ma pota indubbi vantaggi...
Grazie mille ancora per l'aiuto...
rgrd non è collegato   Rispondi citando
Vecchio 25-11-2009, 12.46.48   #11
P8257 WebMaster
Gold Member
 
Registrato: 07-01-2002
Loc.: Milano
Messaggi: 2.863
P8257 WebMaster promette bene
Figurati, è una sintassi che una volta imparata ti risolve un sacco di problemi, conosco anch'io la sintassi che hai usato e l'ho usata parecchie volte in passato, può apparire piu' semplice e pratica (sicuramente c'é da scrivere di meno) .. ma ti impedisce di specificare in dettaglio le clausole di unione delle tabelle.
P8257 WebMaster non è collegato   Rispondi citando
Vecchio 25-11-2009, 12.52.30   #12
rgrd
Newbie
 
Registrato: 23-12-2005
Loc.: Tirano
Messaggi: 9
rgrd promette bene
Già che ho avuto la fortuna di trovarti provo a porti un'altra domanda... All'interno di un singolo count è possibile includere più campi? Mi spiego meglio: dove io ho il count COUNT(T5.[Qty]) AS 'Bolla_carico' dovrei fare il seguente controllo: se nella tabella T5 esiste almeno un campo allora fammi il count, se il count è 0 controllami nella tabella T6, che ancora devo interrogare, secondo prestabilite clausule where se esistono record.
E' possibile una cosa del genere o è meglio che cambio spacciatore??
rgrd non è collegato   Rispondi citando
Vecchio 25-11-2009, 13.01.46   #13
P8257 WebMaster
Gold Member
 
Registrato: 07-01-2002
Loc.: Milano
Messaggi: 2.863
P8257 WebMaster promette bene
Certo, è possibile

ti faccio l'esempio con la tua query

Codice:
(SELECT
T1.[CompanyName],
T3.[Item],
[T3].[Description], 
COUNT(T3.[Qty]) AS 'Ordinato_cliente', 
COUNT(T4.[Qty]) AS 'Ordinato_fornitore', 
COUNT(T5.[Qty]) AS 'Bolla_carico'
FROM [MA_CustSupp] AS T1
INNER JOIN [MA_ItemsGoodsData] AS T2
ON T2.[Supplier]=T1.[CustSupp]
INNER JOIN [MA_SaleOrdDetails] AS T3
ON T3.[Item] = T2.[Item]
INNER JOIN [MA_PurchaseOrdDetails] AS T4
ON T4.[Item] = T3.[Item]
inner JOIN [MA_PurchaseDocDetail] AS T5
ON T5.[Item] = T3.[Item]
GROUP BY
T1.[CompanyName],T3.[Item],T3.[Description]
)
UNION
(SELECT
T1.[CompanyName],
T3.[Item],
[T3].[Description], 
COUNT(T3.[Qty]) AS 'Ordinato_cliente', 
COUNT(T4.[Qty]) AS 'Ordinato_fornitore', 
COUNT(T6.[Qty]) AS 'Bolla_carico'
FROM [MA_CustSupp] AS T1
INNER JOIN [MA_ItemsGoodsData] AS T2
ON T2.[Supplier]=T1.[CustSupp]
INNER JOIN [MA_SaleOrdDetails] AS T3
ON T3.[Item] = T2.[Item]
INNER JOIN [MA_PurchaseOrdDetails] AS T4
ON T4.[Item] = T3.[Item]
INNER JOIN  <TABELLA> AS T6
    ON T6.... 
WHERE NOT EXISTS (SELECT 1 FROM [MA_PurchaseDocDetail] WHERE .... )
GROUP BY
T1.[CompanyName],T3.[Item],T3.[Description]
)
Il modo piu' semplice e lineare è mettere in union praticamente la stessa query però dividendola in due in questo caso sei MATEMATICAMENTE sicuro che nella prima query entrerai soltanto se in T5 esistono dei valori e quindi potrai fare il count su t5 nella seconda il contrario e quindi potrai integrare la tabella T6 .. notare la conversione tra left outer join a inner join nella prima query che così ti esclude i record che ti prende la secona query....

Altro modo per farlo (piu' incasinato ma funziona ugualmente) è utilizare la sintassi CASE WHEN .. THEN .. in cui nella lista di campi di selezione puoi impostare la sostituzione di un campo piuttosto di un altro a partire da condizioni specifiche....
P8257 WebMaster non è collegato   Rispondi citando
Vecchio 25-11-2009, 13.05.57   #14
rgrd
Newbie
 
Registrato: 23-12-2005
Loc.: Tirano
Messaggi: 9
rgrd promette bene
Fantastico, la clausula union l'ho già utilizzata per altre query, ma io mi ricordavo che servisse per accodare più campi dello stesso tipo presi da query diverse, non per fare l'operazione che ti ho chiesto io... E' sbagliata questa informazione?
rgrd non è collegato   Rispondi citando
Vecchio 25-11-2009, 13.10.53   #15
P8257 WebMaster
Gold Member
 
Registrato: 07-01-2002
Loc.: Milano
Messaggi: 2.863
P8257 WebMaster promette bene
La parola chiave UNION in pratica unisce piu' risultati provenienti da piu' istruzioni select, che poi le istruzioni select siano fatte su tabelle o su valori fissi o su function non importa, l'importante è che i result set delle istruzioni select da unire siano uguali . praticamente come dicevi, dello stesso tipo

Codice:
(SELECT 1 AS 'Numero')
UNION
(SELECT 2 AS 'Numero')
equivale a scrivere

Codice:
SELECT 1
SELECT 2
Ovviamente applicata alle query unisce risultati di piu' query.
Attenzione che la union viene fatta a livello logico nel motore sql il che significa che non puoi essere certo né dell'ordinamento e né di altre clausole minori di unione per affinità dei record, se vuoi ordinare la query dovrai effettuare quindi una select esterna ordinata sul result set di union.

La clausola ALL se non ricodo male, preserva anche i duplicati.
P8257 WebMaster non è collegato   Rispondi citando
Rispondi


Utenti attualmente attivi che stanno leggendo questa discussione: 1 (0 utenti e 1 ospiti)
 
Strumenti discussione

Regole di scrittura
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is ON
Gli smilies sono ON
[IMG] è ON
Il codice HTML è OFF

Vai al forum

Discussioni simili
Discussione Autore discussione Forum Risposte Ultimo messaggio
Segnalazioni KB (Knowledge Base) Microsoft giancarlof Segnalazioni Web 71 12-07-2007 10.04.00
Impossibile avviare SQL Server GiulioCesare Software applicativo 0 03-01-2005 23.28.52
errore SQL URGENTE!!!! woodrook Windows 7/Vista/XP/ 2003 1 29-10-2004 12.50.03
Origine record diverse. Fast-M Programmazione 5 26-10-2004 09.24.26
Stringa sql e VB?! Fast-M Programmazione 16 24-10-2004 17.32.11

Orario GMT +2. Ora sono le: 10.28.15.


E' vietata la riproduzione, anche solo in parte, di contenuti e grafica.
Copyright © 1999-2017 Edizioni Master S.p.A. p.iva: 02105820787 • Tutti i diritti sono riservati
L'editore NON si assume nessuna responsabilità dei contenuti pubblicati sul forum in quanto redatti direttamente dagli utenti.
Questi ultimi sono responsabili dei contenuti da loro riportati nelle discussioni del forum
Powered by vBulletin - 2010 Copyright © Jelsoft Enterprises Limited.