|
| 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 » | |
25-11-2009, 11.27.46 | #1 |
Newbie
Registrato: 23-12-2005
Loc.: Tirano
Messaggi: 9
|
Visualizzazione record nulli SQL
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... |
25-11-2009, 11.48.11 | #2 |
Gold Member
Registrato: 07-01-2002
Loc.: Milano
Messaggi: 2.863
|
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 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>] |
25-11-2009, 11.54.38 | #3 |
Newbie
Registrato: 23-12-2005
Loc.: Tirano
Messaggi: 9
|
Grazie per la risposta, provo subito....
|
25-11-2009, 12.04.56 | #4 |
Newbie
Registrato: 23-12-2005
Loc.: Tirano
Messaggi: 9
|
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..... |
25-11-2009, 12.07.26 | #5 |
Gold Member
Registrato: 07-01-2002
Loc.: Milano
Messaggi: 2.863
|
E' sbagliata la sintassi .. ti posto la query corretta....
|
25-11-2009, 12.08.36 | #6 |
Newbie
Registrato: 23-12-2005
Loc.: Tirano
Messaggi: 9
|
grazie....
|
25-11-2009, 12.23.43 | #7 |
Gold Member
Registrato: 07-01-2002
Loc.: Milano
Messaggi: 2.863
|
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 |
25-11-2009, 12.34.15 | #8 |
Newbie
Registrato: 23-12-2005
Loc.: Tirano
Messaggi: 9
|
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 |
25-11-2009, 12.37.25 | #9 |
Gold Member
Registrato: 07-01-2002
Loc.: Milano
Messaggi: 2.863
|
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.
|
25-11-2009, 12.43.24 | #10 | |
Newbie
Registrato: 23-12-2005
Loc.: Tirano
Messaggi: 9
|
Sei un genio, ho riordinato le tabelle e sistemato due cose e ora tutto funziona perfettamente, posto il codice corretto:
Quota:
Grazie mille ancora per l'aiuto... |
|
25-11-2009, 12.46.48 | #11 |
Gold Member
Registrato: 07-01-2002
Loc.: Milano
Messaggi: 2.863
|
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.
|
25-11-2009, 12.52.30 | #12 |
Newbie
Registrato: 23-12-2005
Loc.: Tirano
Messaggi: 9
|
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?? |
25-11-2009, 13.01.46 | #13 |
Gold Member
Registrato: 07-01-2002
Loc.: Milano
Messaggi: 2.863
|
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] ) 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.... |
25-11-2009, 13.05.57 | #14 |
Newbie
Registrato: 23-12-2005
Loc.: Tirano
Messaggi: 9
|
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?
|
25-11-2009, 13.10.53 | #15 |
Gold Member
Registrato: 07-01-2002
Loc.: Milano
Messaggi: 2.863
|
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') Codice:
SELECT 1 SELECT 2 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. |
Utenti attualmente attivi che stanno leggendo questa discussione: 1 (0 utenti e 1 ospiti) | |
Strumenti discussione | |
|
|
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 |