Visualizzazione dei risultati da 1 a 9 su 9

Discussione: Informazione full join

  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2021
    Messaggi
    38

    Informazione full join

    Buongiorno, io devo fare una query select ad un database(PostgreSql nel mio caso). Dal momento che ho due tabelle "patient_mapping" e "patient_mapping_test" e devo fare una full join finalizzata a verificare che un certo paziente non sia presente nè nell'una nè nell'altra tabella, ha più senso fare una full join sola od unire i risultati con una union? perchè ho notato che con le singole full join mi vengono restituiti in output risultati diversi a seconda dell'ordine con cui gliele passo alla full join.

    AD esempio con questo ordine di tabelle passate ottengo un risultato
    codice:
    (select  coalesce (pm.patient_num,pmt.patient_num) as patient_num,
    coalesce (pm.patient_ide_source ,pmt.patient_ide_source) as patient_ide_source
    from patient_mapping pm full join patient_mapping_test pmt 
    on pm.patient_ide = pmt.patient_ide 
    where pm.patient_ide ='PAT004')
    mentre con l'ordine invertito ottengo un altro output:
    codice:
    (select  coalesce (pmt.patient_num,pm.patient_num) as patient_num,
    coalesce (pmt.patient_ide_source ,pm.patient_ide_source) as patient_ide_source
    from patient_mapping_test pmt full join patient_mapping pm
    on pmt.patient_ide = pm.patient_ide 
    where pmt.patient_ide ='PAT004');

    E io stavo pensando,dato che devo verificare se il record non sia presente nè nell'una
    nè nell'altra tabella, se non sia più corretto fare cosi:
    codice:
    (select  coalesce (pm.patient_num,pmt.patient_num) as patient_num,
    coalesce (pm.patient_ide_source ,pmt.patient_ide_source) as patient_ide_source
    from patient_mapping pm full join patient_mapping_test pmt 
    on pm.patient_ide = pmt.patient_ide 
    where pm.patient_ide ='PAT004')
    union 
    (select  coalesce (pmt.patient_num,pm.patient_num) as patient_num,
    coalesce (pmt.patient_ide_source ,pm.patient_ide_source) as patient_ide_source
    from patient_mapping_test pmt full join patient_mapping pm
    on pmt.patient_ide = pm.patient_ide 
    where pmt.patient_ide ='PAT004');
    In modo da prendere tutte le corrispondenze?

    Qualcuno sa dirmi quale tra esse sia la soluzione più corretta ? Grazie

  2. #2
    non capisco l'uso della JOIN.... non ti basta una COUNT() e controllare che sia zero?

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2021
    Messaggi
    38
    Quote Originariamente inviata da optime Visualizza il messaggio
    non capisco l'uso della JOIN.... non ti basta una COUNT() e controllare che sia zero?
    la full outer join l'ho impiegata in quanto devo verificare che quel paziente non sia presente in nessuna delle due tabelle, cioè che quindi non ci sia nel database

    però quello che ho notato che se utilizzo come left table una delle due piuttosto che l'altra i risultati in output cambiano
    cioè per intenderci se utilizzo patient_mapping come left table e la test come right table o viceversa in output ottengo un numero di corrispondenza differenti, quindi pensavo di fare la union, però non so sei giusto..
    Ultima modifica di Chiello9; 27-02-2021 a 17:47

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2021
    Messaggi
    38
    Quote Originariamente inviata da optime Visualizza il messaggio
    non capisco l'uso della JOIN.... non ti basta una COUNT() e controllare che sia zero?
    esempio con questa query in cui patient_mapping era la left
    codice:
    (select  coalesce (pm.patient_num,pmt.patient_num) as patient_num,
    coalesce (pm.patient_ide_source ,pmt.patient_ide_source) as patient_ide_source
    from patient_mapping pm full join patient_mapping_test pmt
    on pm.patient_ide = pmt.patient_ide 
    where pm.patient_ide ='PAT004' )
    ottengo in output:
    codice:
    2    anagrafica
    2    anagrafica
    2    anagrafica
    2    anagrafica
    2    anagrafica
    2    anagrafica
    2    anagrafica
    2    anagrafica
    2    anagrafica
    2    anagrafica
    2    anagrafica
    2    anagrafica
    2    anagrafica
    2    anagrafica
    2    anagrafica
    2    anagrafica
    2    anagrafica
    2    anagrafica
    2    anagrafica
    2    anagrafica
    2    anagrafica
    2    anagrafica
    2    anagrafica
    2    anagrafica
    2    anagrafica
    2    qrscp
    2    qrscp
    2    qrscp
    2    qrscp
    2    qrscp
    2    qrscp
    2    qrscp
    2    qrscp
    2    qrscp
    2    qrscp
    con questa query in cui patient_mapping era la right:
    codice:
    (select  coalesce (pmt.patient_num,pm.patient_num) as patient_num,
    coalesce (pmt.patient_ide_source ,pm.patient_ide_source) as patient_ide_source
    from patient_mapping_test pmt full join patient_mapping pm 
    on pmt.patient_ide = pm.patient_ide 
    where pmt.patient_ide ='PAT004');
    ottengo in output:
    codice:
    2    anagrafica
    2    anagrafica
    2    anagrafica
    2    anagrafica
    2    anagrafica
    2    anagrafica
    2    anagrafica
    2    qrscp
    2    qrscp
    2    qrscp
    2    qrscp
    2    qrscp
    2    qrscp
    2    qrscp
    2    qrscp
    2    qrscp
    2    qrscp
    2    qrscp
    2    qrscp
    2    qrscp
    2    qrscp
    2    qrscp
    2    qrscp
    2    qrscp
    2    qrscp
    2    qrscp
    2    qrscp
    2    qrscp
    2    qrscp
    2    qrscp
    2    qrscp
    2    qrscp
    2    qrscp
    2    qrscp
    I risultati sono diversi



    con la union otterrei
    codice:
    2    qrscp
    2    anagrafica
    unisce le corrispondenze delle due tabelle e mi restiuisce di fatto i record una corrispondenza sola

  5. #5
    ci riprovo: per verificare se un nome è in una tabella ti basta fare
    codice:
    SELECT COUNT(nome) AS quanti FROM tabella WHERE nome=''quellochevuoi'
    se quanti è zero allora non c'è
    se le tabelle sono due, fai due COUNT()...

  6. #6
    Utente di HTML.it
    Registrato dal
    Feb 2021
    Messaggi
    38
    Quote Originariamente inviata da optime Visualizza il messaggio
    ci riprovo: per verificare se un nome è in una tabella ti basta fare
    codice:
    SELECT COUNT(nome) AS quanti FROM tabella WHERE nome=''quellochevuoi'
    se quanti è zero allora non c'è
    se le tabelle sono due, fai due COUNT()...
    devo farlo in una sola query e non in due query select

  7. #7
    perché?
    e comunque, metti le query in UNION, e poi con una query esterna fai la SUM()
    in questo modo le tabelle possono essere n

  8. #8
    Utente di HTML.it
    Registrato dal
    Feb 2021
    Messaggi
    38
    Quote Originariamente inviata da optime Visualizza il messaggio
    perché?
    e comunque, metti le query in UNION, e poi con una query esterna fai la SUM()
    in questo modo le tabelle possono essere n
    No le tabelle sono 2, non sono n, so già essere due, devo fare un controllo che includa le due tabelle

  9. #9
    Quote Originariamente inviata da Chiello9 Visualizza il messaggio
    No le tabelle sono 2, non sono n, so già essere due, devo fare un controllo che includa le due tabelle
    Ci deve essere qualcosa di profondo dietro questa tua osservazione, ma io non sono in grado di capirlo. Infatti io non avrei detto "non sono n ma 2", piuttosto avrei detto "nel mio caso n=2"

    Comunque, ok, vuol dire che farai più in fretta a scrivere la query

Tag per questa discussione

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 © 2024 vBulletin Solutions, Inc. All rights reserved.