Visualizzazione dei risultati da 1 a 9 su 9

Discussione: Query join oracle

  1. #1
    Utente di HTML.it
    Registrato dal
    May 2013
    Messaggi
    4

    Query join oracle

    Salve a tutti,
    mi trovo a dover fare una query su due tabelle come in esempio.
    Devo recuperare codice via e nome da

    codice:
    Tab1
    codice	indirizzo
    codice1	via1
    codice2	via2
    codice3	via3
    codice4	via4
    codice:
    Tab2
    codice	data	 nome
    codice1	data1	 nome1
    codice1	data2	 nome1
    codice1	data3	 nome2
    codice2	data3	 nome3
    codice3	data5	 nome4
    codice3	data6	 nome5
    codice4	data3	 nome6
    con la data più recente in Tab2 per ogni codice (data1<data6)

    Ho pensato
    codice:
    SELECT Tab1.codice, Tab1.via, Tab2.nome, max(Tab2.data)
    FROM Tab1, Tab2
    WHERE Tab1.codice=Tab2.codice
    GROUP BY
    Tab1.codice, Tab1.via, Tab2.nome
    ORDER BY
    Tab2.nome
    ma non dà i risultati sperati in quanto vorrei ottenere un record univoco per ogni codice, quindi supponevo servisse un join o un select annidato ma non essendo esperto chiedo qui.

  2. #2
    Ciao,

    Hai fatto un esempio di dati presenti nelle tabelle, potresti farci anche un esempio di output?
    Non si può risolvere un problema usando lo stesso modo di pensare che ha creato quel problema.
    Albert Einstein

    Siate Affamati, siate Folli, siate Onesti e siate Generosi

  3. #3
    Utente di HTML.it
    Registrato dal
    May 2013
    Messaggi
    4
    certo, un problema dell'output è sovente questo

    codice:
    codice1	via1 	 nome1
    codice1	via1 	 nome1
    codice1	via1 	 nome2
    ...
    come se il max() non funzionasse correttamente, mi chiedevo quindi se ci fossero altri modi per trovar quello che cerco


    l'output che desidero è, date le tabelle (ho inserito qui sotto anche il campo data)

    codice:
    codice1	via1 data3 nome2
    codice2	via2 data3 nome3
    codice3	via3 data6 nome5
    codice4	via4 data3 nome6

  4. #4
    scusami mi sono espresso male.

    Potresti scrivere un esempio di output che vorresti ottenere e non di output sbagliato che ottieni...
    Non si può risolvere un problema usando lo stesso modo di pensare che ha creato quel problema.
    Albert Einstein

    Siate Affamati, siate Folli, siate Onesti e siate Generosi

  5. #5
    ok non avevo letto la modifica.

    Prova cosi :

    codice:
    SELECT t1.codice, t1.indirizzo, t2.nome
    FROM tab1 as t1, tab2 as t2
    WHERE t1.codice = t2.codice and t2.data >= (
                                      SELECT MAX(t22.data)
                                      FROM tab2 as t22
                                      WHERE t2.codice = t22.codice)
    Non si può risolvere un problema usando lo stesso modo di pensare che ha creato quel problema.
    Albert Einstein

    Siate Affamati, siate Folli, siate Onesti e siate Generosi

  6. #6
    Ciao,
    sulla tabella delle date, visto che sei sul potente Oracle, utilizza la funzione DENSE_RANK

    Esempio
    MAX (codice1 )KEEP (DENSE_RANK LAST ORDER BY data3 ASC NULLS LAST)

    Se hai bisogno di altre info sulla funzione sopra indicata o cerchi in internet oppure chiedi pure

    Ciao
    Mik

  7. #7
    Thò, mi son divertito un pò con la tua query:

    select * from (
    select 'codice1' as codice, 'via1' as indirizzo from dual union all
    select 'codice2' as codice, 'via2' as indirizzo from dual union all
    select 'codice3' as codice, 'via3' as indirizzo from dual union all
    select 'codice4' as codice, 'via4' as indirizzo from dual
    ) tab1,
    (select codice, MAX (nome)KEEP (DENSE_RANK LAST ORDER BY data_M ASC NULLS LAST) from (
    select 'codice1' as codice, sysdate as data_M, ' nome1' as nome from dual union all
    select 'codice1' as codice, sysdate-1 as data_M, ' nome2' as nome from dual union all
    select 'codice1' as codice, sysdate-2 as data_M, ' nome3' as nome from dual union all
    select 'codice2' as codice, sysdate-1 as data_M, ' nome4' as nome from dual union all
    select 'codice3' as codice, sysdate-2 as data_M, ' nome7' as nome from dual union all
    select 'codice3' as codice, sysdate-1 as data_M, ' nome5' as nome from dual union all
    select 'codice4' as codice, sysdate-1 as data_M, ' nome6' as nome from dual
    )
    group by codice) tab2
    where tab1.codice=tab2.codice

    a te basterà sostituire il codice fra parentesi con la select sulla tue due tabelle

    Ciao
    Mik

  8. #8
    Utente di HTML.it
    Registrato dal
    May 2013
    Messaggi
    4
    Grazie per le risposte.
    Avevo già provato la funzione MAX con KEEP (ho recuperato una vecchia query), ma resta il problema che non trova la data massima per uno stesso codice.
    Potresti indicarmi dove trovare delle semplici delucidazioni su quella funzione?

    Per quanto riguarda il select annidato, dà un [Err] ORA-00933: SQL command not properly ended.

    La versione di oracle è la 11.1.0.6.0

  9. #9
    Utente di HTML.it
    Registrato dal
    May 2013
    Messaggi
    4
    Vorrei che Per Ogni codice trova quello che ha data MAX

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.