Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2011
    Messaggi
    420

    confronto 2 query sql estrazione movimenti

    Ciao a tutti;

    ho ereditato un applicativo che effetua un'estrazione movimenti da un db oracle e propone la visualizzazione in 2 formati differenti.
    Le query che dovrebbero essere equivalenti hanno però una differenza sostanziale, ossia la seconda effettua una sorta di "distinct" non ben specificata, in quanto per movimenti identici in tutto e per tutto, ne tira fuori solo uno, mentre la prima query li mostra tutti.
    Mi aiutate ad inquadrare la parte di codice colpevole di questa sorta di distinct?
    Per completezza e per confronto posto entrambe le query:


    --STANDARD

    codice:
    select cc.id_fondo||' '||cc.divisa as conto, 'B' as tipo, mb.nr_conto as conto_banca, '' as null1,         
    	mb.segno_importo||mb.importo as importo, to_char(to_date(mb.data_contabile, 'dd/mm/rrrr'), 'rrrrmmdd') as data_contabile,         
    	to_char(to_date(mb.data_valuta, 'dd/mm/rrrr'), 'rrrrmmdd') as data_valuta, mb.id_causale_banca as causale,         
    	mb.codice_isin, '' as fiche, mb.flag_domino as stringa, '' as null2, '' as null3,         
    	replace(replace(mb.descrizione, chr(10), '_'), chr(13), '_') as descrizione,         
    		case when instr(commento, '<?_') <> 0 
    			then replace(replace(substr(commento, instr(commento, '<?_')+13), chr(10), '_'), chr(13), '_') 
    		else 
    			replace(replace(commento, chr(10), '_'), chr(13), '_') end as commento,         
    		case when flag_domino is not null 
    			then 'SI' 
    		else 
    			'NO' end as stringatura  
    from movimentobanca mb, contocontabilita cc, bancacontabilita bc  
    where bc.nr_conto = mb.nr_conto  and bc.divisa = mb.divisa  
    and bc.abi = mb.abi  and bc.nr_conto_contab = cc.nr_conto  
    and flag_stato = 'A'  and to_date(mb.DATA_CONTABILE, 'dd/mm/rrrr') <= to_date('23/04/2013','dd/mm/rrrr')  
    and (  ( bc.nr_conto = '123456789' and bc.abi = '01234' 
    and bc.divisa = 'JPY' )  )  
    
    union  
    
    select cc.id_fondo||' '||cc.divisa as conto, 'A' as tipo, bc.nr_conto as conto_banca, '' as null1,         
    	mc.segno_importo||mc.importo as importo,       
    	to_char(to_date(mc.data_contabile, 'dd/mm/rrrr'), 'rrrrmmdd') as data_contabile,         
    	to_char(to_date(mc.data_valuta, 'dd/mm/rrrr'), 'rrrrmmdd') as data_valuta,         
    	mc.id_causale_contab as causale, mc.codice_isin, mc.fiche, mc.flag_domino as stringa, '' as null2, '' as null3,         
    	replace(replace(mc.descrizione, chr(10), '_'), chr(13), '_') as descrizione,         
    		case when instr(commento, '<?_') <> 0 
    			then replace(replace(substr(commento, instr(commento, '<?_')+13), chr(10), '_'), chr(13), '_') 
    		else 
    			replace(replace(commento, chr(10), '_'), chr(13), '_') end as commento,         
    		case when flag_domino is not null 
    			then 'SI' 
    		else 
    			'NO' end as stringatura  
    from movimentocontabilita mc, contocontabilita cc, bancacontabilita bc  
    where mc.nr_conto = cc.nr_conto  and cc.nr_conto = bc.nr_conto_contab  and mc.flag_stato in ('A','C')  
    and to_date(mc.DATA_CONTABILE, 'dd/mm/rrrr') <= to_date('23/04/2013','dd/mm/rrrr')  
    and (  ( bc.nr_conto = 'I123456789' and bc.abi = '01234' 
    and bc.divisa = 'JPY' )  )



    --ACC. COMP
    codice:
    select cc.id_fondo||' '||cc.divisa as conto, 'B' as tipo, mb.nr_conto as conto_banca, '' as null1, mb.segno_importo||mb.importo as importo,         
    	to_char(to_date(mb.data_contabile, 'dd/mm/rrrr'), 'rrrrmmdd') as data_contabile,         
    	to_char(to_date(mb.data_valuta, 'dd/mm/rrrr'), 'rrrrmmdd') as data_valuta,         
    	mb.id_causale_banca as causale, mb.codice_isin, '' as fiche, mb.flag_domino as stringa, '' as null2, '' as null3,         
    	replace(replace(mb.descrizione, chr(10), '_'), chr(13), '_') as descrizione,         
    		case when instr(commento, '<?_') <> 0 
    			then replace(replace(substr(commento, instr(commento, '<?_')+13), chr(10), '_'), chr(13), '_') 
    		else 
    			replace(replace(commento, chr(10), '_'), chr(13), '_') end as commento,         
    		case when flag_domino is not null 
    			then 'SI' 
    		else 
    			'NO' end as stringatura  
    from movimentobanca mb, contocontabilita cc, bancacontabilita bc  
    where bc.nr_conto = mb.nr_conto  
    and bc.divisa = mb.divisa  
    and bc.abi = mb.abi  
    and bc.nr_conto_contab = cc.nr_conto  
    and flag_stato = 'A'  
    and to_date(mb.DATA_CONTABILE, 'dd/mm/rrrr') <= to_date('23/04/2013','dd/mm/rrrr')  
    and (  ( bc.nr_conto = '123456789' 
    and bc.abi = '01234' and bc.divisa = 'JPY' )  )  
    
    union  
    
    select cc.id_fondo||' '||cc.divisa as conto, 'A' as tipo, bc.nr_conto as conto_banca, '' as null1,mc.segno_importo||mc.importo as importo,         
    	to_char(to_date(mc.data_contabile, 'dd/mm/rrrr'), 'rrrrmmdd') as data_contabile,         
    	to_char(to_date(mc.data_valuta, 'dd/mm/rrrr'), 'rrrrmmdd') as data_valuta,         
    	mc.id_causale_contab as causale, mc.codice_isin, mc.fiche, mc.flag_domino as stringa, '' as null2, '' as null3,         
    	replace(replace(mc.descrizione, chr(10), '_'), chr(13), '_') as descrizione,         
    	case when instr(commento, '<?_') <> 0 
    		then replace(replace(substr(commento, instr(commento, '<?_')+13), chr(10), '_'), chr(13), '_') 
    	else 
    		replace(replace(commento, chr(10), '_'), chr(13), '_') end as commento,         
    	case when flag_domino is not null 
    		then 'SI' 
    	else 
    		'NO' end as stringatura  
    from movimentocontabilita mc, contocontabilita cc, bancacontabilita bc  
    where mc.nr_conto = cc.nr_conto  
    and cc.nr_conto = bc.nr_conto_contab  
    and mc.flag_stato in ('A','C')  
    and to_date(mc.DATA_CONTABILE, 'dd/mm/rrrr') <= to_date('23/04/2013','dd/mm/rrrr')  
    and (  ( bc.nr_conto = '123456789' 
    and bc.abi = '01234' and bc.divisa = 'JPY' )  )
    - "Si sono vegetariano. Diciamo che non mangio nulla che abbia un cuore"
    - "E i carciofi?"

  2. #2

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2011
    Messaggi
    420
    Hai ragione, la prima query è questa:

    --STANDARD

    codice:
    select cc.id_fondo as portafoglio,  mb.divisa, 'B' as lato,  mb.nr_conto,  mb.data_valuta,  mb.data_contabile,  
    mb.segno_importo,  trim (to_char(mb.importo, '999G999G999G999G999G990D99', 'NLS_NUMERIC_CHARACTERS=,.')) as importo,  
    mb.id_causale_banca as causale,  mb.flag_domino as stringatura,  '' as fiche,  
    case when instr(commento, '<?_') <> 0 then 
    replace(replace(substr(commento, instr(commento, '<?_')+13), chr(10), '_'), chr(13), '_') 
    else replace(replace(commento, chr(10), '_'), chr(13), '_') end as commento,  
    replace(replace(mb.descrizione,chr(10), '_'), chr(13), '_') as descrizione,  mb.id_movimento  
    from movimentobanca mb, bancacontabilita bc, contocontabilita cc, fondo f   
    where mb.nr_conto = bc.nr_conto  
    and mb.divisa = bc.divisa  
    and bc.nr_conto_contab = cc.nr_conto  
    and cc.id_fondo = f.id_fondo  
    and flag_stato in ('A')  
    and to_date(mb.DATA_CONTABILE, 'dd/mm/rrrr') <= to_date('23/04/2013','dd/mm/rrrr')  
    and (  ( bc.nr_conto = '123456789' and bc.abi = '01234' and bc.divisa = 'JPY' )  )  
    
    union  
    
    select cc.id_fondo as portafoglio,  cc.divisa,  'C' as lato,  '' as nr_conto,  mc.data_valuta,  mc.data_contabile,  mc.segno_importo,  
    trim(to_char(mc.importo, '999G999G999G999G999G990D99', 'NLS_NUMERIC_CHARACTERS=,.')) as importo,  
    mc.id_causale_contab as causale,  mc.flag_domino as stringatura,  mc.fiche,  
    case when instr(commento, '<?_') <> 0
    then replace(replace(substr(commento, instr(commento, '<?_')+13), chr(10), '_'), chr(13), '_') 
    else replace(replace(commento, chr(10), '_'), chr(13), '_') end as commento,  
    replace(replace(mc.descrizione, chr(10), '_'), chr(13), '_') as descrizione,  mc.id_movimento  
    from movimentocontabilita mc, bancacontabilita bc, contocontabilita cc, fondo f  
    where mc.nr_conto = cc.nr_conto  
    and cc.nr_conto = bc.nr_conto_con
    tab  and cc.id_fondo = f.id_fondo  
    and flag_stato in ('A','C')  
    and to_date(mc.DATA_CONTABILE, 'dd/mm/rrrr') <= to_date('23/04/2013','dd/mm/rrrr')  
    and (  ( bc.nr_conto = '123456789' and bc.abi = '01234' and bc.divisa = 'JPY' )  )
    - "Si sono vegetariano. Diciamo che non mangio nulla che abbia un cuore"
    - "E i carciofi?"

  4. #4
    Utente di HTML.it
    Registrato dal
    Sep 2011
    Messaggi
    420
    Sto notando che nella query standard viene estratto anche il campo id_movimento, che per movimenti uguali, sarebbe l'unica cosa che li diversifica, mentre nella querry ACC-COMP questo campo non viene estratto... potrebbe essere questo che influisce?
    Resta il fatto però che se non richiedo espressamente una "distinct" anche se i movimenti sono totalmente uguali, dovrebbe comunque farmeli vedere tutti...
    - "Si sono vegetariano. Diciamo che non mangio nulla che abbia un cuore"
    - "E i carciofi?"

  5. #5
    Hai ragione, con l'id_movimento ti da tutti i movimenti, ma senza quel campo per non avere record ripetuti dovresti utilizzare o la distinct oppure non referenziare proprio la tabella che fa duplicare i record. Prova a verificare cosa fa duplicare i record e controlla in quella non duplicata se è presente lo stesso oggetto

    Ciao
    Mik

  6. #6
    Utente di HTML.it
    Registrato dal
    Sep 2011
    Messaggi
    420
    Ciao, grazie per l'aiuto prima di tutto, però nn mi è chiaro esattamente cosa intendi con "verifica cosa fa duplicare i record"... cioè per me in assenza di distinct, è corretto che vengano visualizzati tutti i record, con o senza id_movimento...

    Voglio fare un esempio molto più semplificato per chiarirmi questo punto;
    mettiamo di avere un'unica tabella 'UTENTI' fatta in questo modo:

    id|nome
    1|Marco
    2|Marco
    3|Marco

    la query standard in questo caso diventa:

    select id,nome
    from utenti

    e il risultato è costituito da tutti e tre i record della tabella;

    la query ACC-COMP invece diventerebbe:

    select nome
    from utenti

    per me dovrebbe tirarmi fuori
    MARCO
    MARCO
    MARCO

    Oppure poichè sono uguali è corretto che mi restituisca un solo record?
    - "Si sono vegetariano. Diciamo che non mangio nulla che abbia un cuore"
    - "E i carciofi?"

  7. #7
    Ciao,
    credo di aver trovato.... è la UNION che ti fa da distinct sui records con valori uguali. Ho fatto questa prova su un db oracle e nel momento in cui utilizzi la UNION anzichè la UNION ALL tutti i record vengono raggruppati e ti restituisce un solo record. Per avere tutti i record, bisogna utilizzare la UNION ALL:

    (select 'PROVA' from dual
    UNION ALL
    select 'PROVA' from dual
    )
    UNION
    (
    select 'PROVA' from dual
    UNION ALL
    select 'PROVA' from dual
    )


    Ciao
    Mik

  8. #8
    Utente di HTML.it
    Registrato dal
    Sep 2011
    Messaggi
    420
    Sei un mito! grazie 10000!!
    - "Si sono vegetariano. Diciamo che non mangio nulla che abbia un cuore"
    - "E i carciofi?"

  9. #9
    Grazie !!! Se ti sono stato di aiuto, è gradita una recensione sul mio portale dei ristoranti su qualche ristorante che conosci.

    Grazie 1000 a te!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.