Query con UNION

di il
4 risposte

Query con UNION

Salve,
sono un novellino, sia del forum che di SQL, ma mi piace cimentarmi in queste cose. Ho cercato un forum italiano su MSSQL e vi ho scovato
Vengo al problema, dovrei eseguire una query su delle tabelle e vorrei mi fossero restituiti dei dati e solo nel caso mancasse il dato di una tabella vorrei mi fosse restituito un altro dato.
Esempio, date queste tabelle con i rispettivi campi:

ART_ICOL.ARCODART  |  KEY_ARTI.CACODICE  |   KEY_ARTI.CACODCON  |  KEY_ARTI.CATIPCON
   codice		codicealt_1			0000358		FORNITORE
   codice		codicealt_2					INTERNO	
   codice1		codicealt1_1			0000358		FORNITORE
   codice2		codicealt2_1					INTERNO		
   codice2		codicealt2_2			0000358		FORNITORE
   codice3		codicealt3_1					INTERNO		

Ho utilizzato questo codice ma mi restituisce sia la riga dove è presente CATIPCON=FORNITORE sia la riga dove è presente CATIPCON=INTERNO, io vorrei che mi restituisse la riga FORNITORE e se manca questa mi restituisse la riga INTERNO. In realtà le tabelle interessate sono di più ma ho cercato di semplificare al massimo:

Select ....
from ....((((COM22ART_ICOL ART_ICOL Inner Join COM22SALDIART SALDIART on ART_ICOL.ARCODART=SALDIART.SLCODICE) Inner 	Join COM22GRUDMAG GRUDMAG on SALDIART.SLCODMAG=GRUDMAG.GRCODMAG) 
Left outer Join COM22PAR_RIOR PAR_RIOR on ART_ICOL.ARCODART=PAR_RIOR.PRCODART) Full Join COM22KEY_ARTI KEY_ARTI on ART_ICOL.ARCODART=KEY_ARTI.CACODART) 

where  (KEY_ARTI.CACODCON = '0000358' AND KEY_ARTI.CATIPCON = 'FORNITORE') OR  KEY_ARTI.CATIPCON = 'R' 
 
Mi sembra una cosa talmente banale, ma non riesco a farlo.. ho tentato con IIF, CASE, ISNULL, UNION, ma niente.
Grazie a chi vorrà dedicarmi un po' del suo tempo

4 Risposte

  • Re: Query con UNION

    Se ho capito bene, ti servono tutte le righe che hanno [CATIPCON=FORNITORE] unite a tutte le righe che hanno [CATIPCON=INTERNO] e il cui codice non è presente nella selezione con [CATIPCON=FORNITORE]?
  • Re: Query con UNION

    Ciao e grazie, mi occorrono tutte le righe che hanno CACODCON=0000358 e per quelle dove non è presente 0000358 deve prelevare la riga con CATIPCON=INTERNO, cioè non devo perdere righe ma scegliere, nel caso siano presenti N righe, quelle con CACODCON 358.

    Cioè per spiegare meglio il contesto, è un elenco di codici interni di articoli da comprare da un fornitore.
    Devo riportare le righe con il codice articolo del fornitore, filtrato per fornitore, nel senso che nella tabella CACODCON ci sono tanti altri codici ma a me interessa solo 358.
    Quando manca il codice del fornitore associato al mio codice interno, deve comunque estrarmi la riga perché altrimenti non acquisto. Dico deve estrarmi la riga con CATIPCON=INTERNO perché il codice interno esiste sempre, ma potrebbe fare qualsiasi altra cosa che mi estragga la riga.
    Correggo la tabellina dei campi così è più completa e metto un esempio del risultato voluto, sarebbe si una unione ma non riesco a farla funzionare.
    
    ART_ICOL.ARCODART  |  KEY_ARTI.CACODICE  |   KEY_ARTI.CACODCON  |  KEY_ARTI.CATIPCON
       codice		codice						INTERNO	  
       codice		codicealt_1		0000358			FORNITORE
       codice1		codice1						INTERNO
       codice1		codicealt1_1		0000358			FORNITORE
       codice1		codicealt1_2		0000555			FORNITORE
       codice2		codice2						INTERNO		
       codice2		codicealt2_2		0000358			FORNITORE
       codice3		codice3						INTERNO		
       codice4		codice4						INTERNO	
       codice4		codice4_1		00001111		FORNITORE
       
       RISULRTATO VOLUTO
       codice		codicealt_1		0000358			FORNITORE
       codice1		codicealt1_1		0000358			FORNITORE
       codice2		codicealt2_2		0000358			FORNITORE
       codice3		codice3						INTERNO		
       codice4		codice4						INTERNO	 
        
    
  • Re: Query con UNION

    Antarctic ha scritto:


    ...Quando manca il codice del fornitore associato al mio codice interno, deve comunque estrarmi la riga perché altrimenti non acquisto...
    Quindi è una LEFT JOIN con la tabella delle giacenze/disponibilità?
    Nel caso, ti sarebbe sufficiente impostare la WHERE con [(KEY_ARTI.CACODCON = '0000358' OR KEY_ARTI.CACODCON IS NULL)]

    Diversamente, supponendo che tu la tabella che hai riportato come esempio riesca ad ottenerla, puoi provare a spostarla in una CTE

    Una cosa tipo:
    
    -- Ottengo tutti i record, per come l'esempio che hai citato
    WITH cte as (-- SELECT che restituisce l'elenco di esempio);
    
    --Estraggo solo quelli per il fornitore 358
    WITH cte358 as (SELECT * FROM [cte] WHERE = [KEY_ARTI.CACODCON] = '0000358')
    
    --Tiro fuori tutti i dati, quelli del 358 e quelli che no
    SELECT * FROM [cte358]
    UNION
    SELECT * FROM cte WHERE [ART_ICOL.ARCODART] NOT IN (SELECT [ART_ICOL.ARCODART] FROM [cte358])
    ORDER BY [ART_ICOL.ARCODART]
    Magari esistono soluzioni più eleganti, ma dovrebbe funzionare...
  • Re: Query con UNION

    Caspita.. complicato, la prima soluzione non va bene perchè otterrei sempre doppie righe (dove esiste il codice foritore e non), la seconda soluzione sembra ok... ma devo fare delle prove, la query va fatta in un gestionale e non so se posso usare le cte

    OOOkkk fatta girare con poche tabelle e filtri e funzionaaa!

    Grazie mille, ora devo implementarla in un contesto un po' più complicato con più dati e group by e order by...
Devi accedere o registrarti per scrivere nel forum
4 risposte