Come per trovare i record utilizzando SQL mancante

April 13

Come per trovare i record utilizzando SQL mancante


L'assenza di dati consultati non suggerisce soltanto attualmente presenti. Un record mancanti, tuttavia, sono dati che potrebbe o dovrebbe essere presente ma non è. Ad esempio, i dati del cliente e gli ordini risiedono in tabelle clienti e ordini. Un elenco di clienti è richiesto, e voi, il programmatore, assumere ogni cliente ha un ordine. Fornendo ai clienti da ordini dovrebbero fornire la lista dei clienti corretto, ma lo fa? Listing clienti da clienti può produrre di più, suggerendo ordini alcuni clienti hanno mancanti. È necessario accertare che i clienti mancano ordini e quindi capire se questa circostanza è di progettazione o di un bug.

istruzione

1 Visualizzare i clienti distinti nella tabella Clienti. Per esempio:

SELEZIONA C.CUSTOMERID DISTINCT
Da parte dei clienti C

2 Visualizzare i clienti distinti nella tabella Ordini. Per esempio:

SELEZIONA O.CUSTOMERID DISTINCT
DA ORDINI O

3 Determinare i clienti con ordini mancanti combinando i punti 1 e 2 in una subquery correlata.

SELEZIONA C.CUSTOMERID DISTINCT
Da parte dei clienti C
DOVE NON ESISTE
(SELECT *

FROM ORDERS O

DOVE O.CUSTOMERID = C.CUSTOMERID)

Esiste è una funzione di Oracle che mette alla prova per l'esistenza di record subquery restituiti. Premettendo con "NOT" test per l'assenza di record. Qui, il subquery soddisfa i clienti in entrambe le tabelle. Gare di ritorno risultati, che escluderebbe quelli abbinati CUSTOMERID di dal set di risultati principale. Solo CUSTOMERID di con alcuna corrispondenza O.CUSTOMERID verrebbe visualizzato.

4 In alternativa, determinare i record manca da una visione composita di tavoli cusotmer e ordine.

SELEZIONA C.CUSTOMERID DISTINCT
DA CLIENTI C, ORDINI O
DOVE C.CUSTOMERID = O.CUSTOMERID (+)

and O.CUSTOMERID is null

Se si sospetta la tabella Order poteva mancare record, quindi provare questa query per visualizzare C.CUSTOMERID e O.CUSTOMERID fianco a fianco. La (+) invoca un join esterno sinistro, che indica a Oracle di mostrare tutti i dati corrispondenti dalla istruzione WHERE più eventuali C.CUSTOMERID di dalla tabella di sinistra che non hanno O.CUSTOMERID corrispondenza di nella tabella di destra.

Se ci sono C.CUSTOMERID di senza O.CUSTOMERID corrispondenza di, si mostrano con valori nulli per l'inesistente O.CUSTOMERID del. Le righe che hanno tali valori nulli rappresentano i record di ordine mancanti.

Se la lista è troppo lunga per l'ispezione visiva, la seconda istruzione WHERE garantisce i risultati sono limitati a C.CUSTOMERID di ordini con mancanti.

Consigli e avvertenze

  • La query viene considerata correlata in quanto la subquery fa riferimento C.Customer, che esiste in una tabella non fa riferimento nella subquery. Oracle elaborerà la subquery un record alla volta, cercando di abbinare ogni O.CUSTOMER ad un C.Customer in successione, restituendo un record null null o meno a seconda del risultato della partita.
  • Un subquery non correlata non ha alcun riferimento a un campo di fuori dei suoi tavoli riferimenti. Questo costringe Oracle per eseguire il subquery e abbinare l'intero set di risultati alla query principale, alla ricerca di corrispondenze con le condizioni di clausola WHERE.
  • Non riuscendo a catturare record mancanti possono influire sulla relazione finale non presentando la piena portata dei dati.