Query tutti risultati tab1, primo risultato tab2, relazionat

di
Anonimizzato10769
il
6 risposte

Query tutti risultati tab1, primo risultato tab2, relazionat

Ciao a tutti, mi chiamo Riccardo e sono nuovo di questo forum
Ho un piccolo problema con una query che non riesco a sviluppare e chiedo un aiuto da parte vostra.
Vado a spiegare quale è il problema.
Ho due tabelle, la prima è composta da
id_prog e nome_prog
la seconda
id_foto, id_prog, nome_foto
queste hanno una relazione 1 a molti, perciò per ogni dato della prima tabella, corrispondono più dati della seconda.

Il mio scopo è ottenere per ogni 'nome_prog' della prima tabella, soltanto il primo 'nome_foto' della seconda tabella.

Sarà possibile farlo?

Grazie

6 Risposte

  • Re: Query tutti risultati tab1, primo risultato tab2, relazionat

    Certo che è possibile, ma non è immediato... e serve ricorrere all'uso delle così dette TABELLE DERIVATE...!

    Prova a studiare questi 2 esempi che estraggono il MAX ed il MIN della Tabella lato MOLTI per ogni ID della Tabella lato 1...!
    Quindi applica il concetto al PRIMO sapendo che per recuperare il 1° si usa il TOP 1 ordinando in modo CRESCENTE.

    Questo è il LINK:
  • Re: Query tutti risultati tab1, primo risultato tab2, relazionat

    Ciao, spino974;
    mi scuso con Alex, non avevo ancora letto la Tua risposta, ma, visto che mi ha impegnato per una buona ½ ora, vorrei proporre una mia molto meno tecnica procedura:
    Ho aperto un nuovo DB con due tabelle:
    “Programma”
    (Chiave primaria) Id_prog à Tipo dati: Testo à Indicizzato: Si (Duplicati non ammessi)
    Nome_prog à Tipo dati: Testo à Indicizzato: No

    “Foto”
    (Chiave primaria) Id_Foto à Tipo dati: Contatore
    Id_prog à Tipo dati: Testo à Indicizzato: Si (Duplicati ammessi)
    Nome_foto à Tipo dati: Testo à Indicizzato: No

    Ho relazionato uno a molti Id_prog della tabella “Programma” con Id_prog della tabella “Foto”

    Ho aperto due maschere:
    “Programma” con i campi [Id_prog] e [Nome_prog]
    “Foto” con i campi [Id_Foto] e [Nome_foto]; ho aggiunto un ComboBox [Id_prog] che fa riferimento a [Id_prog] di “Programma”

    In “Foto”, ho inserito:
    Id_Foto Id_Prog Nome_foto
    1……….UNO…. PRIMA
    2……….UNO…. SECONDA
    3……….UNO…. TERZA
    4……….DUE….. QUARTA
    5……….DUE….. QUINTA
    6……….SEI...….. SESTA

    In “Programma”, ho inserito:
    Id_Prog Nome_PROG
    UNO….. UNO
    DUE ….. DUE
    TRE…… TRE
    QUA….. QUATTRO
    CIN….... CINQUE
    SEI...….. SEI

    Sempre in “Programma”, ho inserito una sottomaschera “Foto” dichiarando: (usa maschera esistente)

    Come risultato di tutto ciò, ho ottenuto che selezionando In “Programma” il primo record, nella sezione “Corpo della maschera compare:
    Id_Prog Nome_PROG
    UNO….. UNO
    Mentre nella sottomaschera compare:
    Id_Foto Id_Prog Nome_foto
    1……….UNO…. PRIMA
    contestualmente viene indicata l’esistenza di tre record che rispondono a [Id_Prog] = UNO; è quindi possibile, sempre dalla sottomaschera, selezionare il secondo e il terzo record.

    Non so se questo Ti può essere utile, io ci ho provato.

    Alex, prometto che mi documenterò sulle Tabelle Derivate di cui non conoscevo l’utilizzo; grazie.

    A disposizione.

    Buona serata.
  • Re: Query tutti risultati tab1, primo risultato tab2, relazionat

    Ho seguito il tuo consiglio ed ho scritto:
    select progetti.nome_progetto, minp.nome_img
    from progetti
    right join
    (select top 1 immagini.id_progetto, immagini.nome_img from immagini) as minp
    on progetti.id_progetto = minp.id_progetto
    Il risultato è il primo valore della tabella 2 con il primo della tabella 1, ma poi si ferma lì, non prosegue col secondo valore della tabella 1.
    Ma forse mi sono spiegato male all'inizio con la domanda, magari cerco di riformularla meglio
    TAB1-> id_progetto, nome_progetto
    TAB2 -> id_img, id_progetto, nome_img

    per ogni TAB1.id_progetto, ci sono tanti TAB2.id_progetto
    quindi voglio leggere tutti i TAB1.id_progetto e per ognuno di essi il primo valore che trovo in TAB2.id_progetto.
    In parole povere se in TAB1 c'ho:
    id_progetto=1; nome_progetto=strada
    id_progetto=2; nome_progetto=ferrovia

    e in TAB2 c'ho
    id_img=1; id_progetto=1; nome_img=Autostrada
    id_img=2; id_progetto=1; nome_img=Sterrato
    id_img=3; id_progetto=2; nome_img=Binario
    id_img=4; id_progetto=2; nome_img=Stazione

    il risultato dovrebbe essere
    Strada; Autostrada
    Ferrovia; Binario


    invece con la query che ho scritto sopra il risultato è:
    Strada; Autostrada

    Dov'è che sbaglio

    Grazie tante per l'aiuto
  • Re: Query tutti risultati tab1, primo risultato tab2, relazionat

    Scusa Giuseppe, ma ho letto la tua risposta dopo che avevo già risposto ad Alex.
    Ti ringrazio per il supporto a questo quesito, il fatto è che non posso utilizzare le maschere, in quanto la query (che spero di riuscire a fare) mi serve all'interno di una pagina web aspx.
    Comunque apprezzo il tempo che mi hai dedicato, e speriamo di riuscirci entrambi ad imparare queste Tabelle Derivate
  • Re: Query tutti risultati tab1, primo risultato tab2, relazionat

    Ti sei spiegato bene... forse non altrettanto io...?

    L'esempio che ti ho fatto, data una tabella Prodotti(T1) ed una tabella Prezzi(T2) estrae per OGNI PRODOTTO in T1 il prezzo MAX e MIN... non si ferma al 1° Prodotto...!!!

    Questo dovrebbe farti riflettere sull'esattezza del predicato SQL che hai scritto... che non è concettualmente equivalente.

    Per compredere il processo fai un TEST su quanto ti ho proposto... e verifica il tutto.
  • Re: Query tutti risultati tab1, primo risultato tab2, relazionat

    ...a forza di sbattere la testa al muro
    ci sono riuscito!!!
    Posto il codice:
    select distinct  progetti.nome_progetto,
    (select top 1 immagini.nome
    from immagini
    where immagini.id_progetto = progetti.id_progetto)
    as img
    from progetti left join immagini
    on immagini.id_progetto = progetti.id_progetto
    Spero che possa servire anche ad altri

    Grazie a tutti!!!
Devi accedere o registrarti per scrivere nel forum
6 risposte