Mysql
 sql >> Database >  >> RDS >> Mysql

Come posso migliorare questa query per evitare di utilizzare viste nidificate?

Familiarizzare con i dati che hai:

La prima cosa fondamentale è capire quali dati hai. Qui in questo caso hai quattro tabelle

  • Compagnie assicurative
  • Paziente
  • Medici
  • Visite

Il tuo obiettivo:

Trova l'elenco di tutti i pazienti che hanno visitato tutti gli ortopedici (specialità) associati alle loro Compagnie di Assicurazione.

Facciamo un passo indietro e analizziamolo in piccoli pezzi:

In generale, i requisiti potrebbero essere un po' opprimenti se li guardi nel complesso. Dividiamo i requisiti in componenti più piccoli per capire cosa devi fare.

  1. Parte a: Devi trovare l'elenco dei medici, la cui specialità è "Ortopedico"
  2. Parte b: Trova l'elenco dei pazienti che hanno visitato i medici identificati al n. 1.
  3. Parte c: Filtra il risultato n. 2 per trovare l'elenco di pazienti e medici che condividono la stessa compagnia assicurativa.
  4. Parte d: Scopri che i pazienti che hanno visitato ciascuno di questi ortopedici che appartengono alla stessa compagnia assicurativa del paziente.

Come avvicinarsi:

  1. Devi identificare il tuo obiettivo principale, qui in questo caso per identificare l'elenco dei pazienti. Quindi, prima interroga la tabella dei pazienti.

  2. Hai i pazienti, in realtà tutti, ma dobbiamo scoprire quale di questi pazienti ha visitato i medici. Non preoccupiamoci se il medico è un ortopedico o meno. Abbiamo solo bisogno dell'elenco dei pazienti e dei medici che hanno visitato. Non c'è mappatura tra la tabella Paziente e Medici. Per scoprire queste informazioni,

    Unisciti alla tabella Pazienti con la tabella Visite nel campo chiave corretto.

    Quindi unisci l'output con la tabella Medici nel campo chiave corretto.

  3. Se hai eseguito correttamente l'iscrizione, ora dovresti avere l'elenco di tutti i pazienti e dei medici che hanno visitato. Se hai usato LEFT OUTER JOIN , troverai anche i pazienti che non hanno mai visitato un medico. Se hai usato RIGHT OUTER JOIN , troverai solo i pazienti che hanno visitato un medico.

  4. Ora hai tutti i pazienti e i dottori che hanno visitato. Tuttavia, il requisito è di trovare solo i medici che sono Ortopedici . Quindi, applica la condizione per filtrare il risultato per fornire solo il risultato desiderato.

  5. Ora hai raggiunto i requisiti suddivisi in componenti più piccoli nella parte a e parte b . Devi ancora filtrarlo dalle compagnie assicurative. Ecco la parte complicata, il requisito non dice che devi visualizzare la compagnia assicurativa, quindi non dobbiamo usare la tabella InsuranceComppanies. La tua prossima domanda sarà 'How am I going to filter the results?' . Punto valido. Scopri se una delle tre tabelle Patient , Doctor e Visits contenere le informazioni sulla compagnia di assicurazione. Patient e Doctors avere un campo comune. Unisciti a quel campo comune per filtrare il risultato.

  6. Trova il numero di ortopedici unici che ogni paziente ha visitato.

  7. Ecco la parte che può essere eseguita in molti modi, uno dei modi per farlo sarebbe aggiungere una sottoquery che sarebbe la tua quarta colonna nell'output. Questa sottointerrogazione interrogherebbe la tabella Medici e filtrerebbe per specialità ='Ortopedico'. Oltre a quel filtro, devi anche filtrare facendo corrispondere la compagnia assicurativa nella tabella interna con l'ID compagnia assicurativa nella tabella Pazienti che si trova nella query principale. Questa sottoquery restituirà il conteggio di tutti gli ortopedici per l'ID compagnia assicurativa che corrisponde ai dati del paziente.

  8. Ora dovresti avere i campi patient id , patient name , patients visits count e il total number of Orthopedists in same insurance company dalla sottointerrogazione. È quindi possibile aggiungere un outer join che filtrerà i risultati da questa tabella derivata nei campi in cui patients visits count corrisponde al total number of Orthopedists in same insurance company . Non sto dicendo che questo sia l'approccio migliore. Questo è un approccio che mi viene in mente.

  9. Se segui la logica di cui sopra, dovresti averlo.

Elenco dei pazienti che hanno visitato tutti i medici

Filtrato solo per medici, i cui ortopedici sono ortopedici

Filtrato per pazienti e medici che condividono le stesse informazioni sulla compagnia assicurativa.

Anche in questo caso, l'intero output viene quindi filtrato dai due campi di conteggio che si trovano all'interno dell'output della tabella derivata.

La palla è nel tuo campo:

  • Provalo passo dopo passo e una volta trovata la risposta. Pubblicalo qui come risposta separata. Lo voterò per compensare tutti i voti negativi che hai ottenuto su questa domanda.

Sono fiducioso che puoi farlo facilmente.

Se inciampi...

Non esitare a pubblicare le tue domande come comments to this answer , altri e io saremo lieti di assisterti.

Disclaimer

Ho fornito uno dei tanti modi in cui questa logica può essere implementata. Sono sicuro che ci sono molti modi per implementarlo in un modo molto migliore.

Risultato:

Si prega di fare riferimento alla risposta di @Ofek Ron per la query corretta che produce l'output desiderato. Non ho scritto nessuna parte della query. È stato tutto uno sforzo di OP.