2013-06-27 16 views
6

Ho una tabella che è una mappatura tra ID stranieri e ID locali.ANY o SE ESISTE in T-SQL

Ho dovuto scrivere una query per scoprire se questa tabella è una biiezione. Sono venuto con questo

IF 1 <> ANY(
    SELECT COUNT(foreignId) 
    FROM mappingTable 
    GROUP BY localId 
    ) 
BEGIN 
    SELECT 'Oh noes!' 
END 

ELSE BEGIN 
    SELECT 'Everything is fine.' 
END 

Il mio supervisore ha preso uno sguardo a questo e fece una smorfia, e mi ha detto che avrei dovuto scrivere questo invece:

IF EXISTS(
    SELECT NULL 
    FROM mappingTable 
    GROUP BY localId 
    HAVING COUNT(foreignId) <> 1 
    ) 
BEGIN 
    SELECT 'Oh noes!' 
END 

ELSE BEGIN 
    SELECT 'Everything is fine.' 
END 

La mia domanda è semplicemente quale di queste query è lo stile migliore . Sono abbastanza sicuro che siano equivalenti.

+0

perché non utilizzare un vincolo UNIQUE sul tavolo? Come UNIQUE (localId, foreignId) in modo che ogni mappatura possa essere inserita solo una volta. Il controllo viene eseguito dal motore del database e non è necessario scrivere alcun codice. –

+0

@ JennyO'Reilly Sto cercando di verificare la sanità dei dati ricevuti da fonti esterne. –

+0

Quindi creare prima la tabella e il vincolo e provare successivamente ad inserire i dati. Il tuo sistema DB dovrebbe generare un errore se i dati non sono corretti. :-) –

risposta

8

I test su SQL Server 2008 mostrano che queste query non solo danno risultati identici, ma hanno anche piani di query identici. Query Optimiser sa già che queste query sono equivalenti. Hai ragione, quindi, che ogni argomento che privilegia l'uno sull'altro dovrà concentrarsi su altri aspetti come lo stile.

Per me personalmente, la seconda query è più facile da capire, anche se la prima query segue più da vicino come esprimere la ricerca in inglese, perché ho visto EXISTS molto più di ANY. La prima domanda mi fa andare "aspetta, cosa? Oh sì, è vero ..." Il secondo è immediatamente ovvio per me. Può essere diverso per gli altri (forse per te); dovresti cercare di assicurarti che le tue domande siano facili da leggere per il tuo supervisore e i tuoi colleghi.

2

Le tue domande sono ugualmente cattive o ugualmente buone a seconda se hai un indice sulla tua colonna o meno.

Senza indice ci sarà una scansione di tabella/scansione indice raggruppata di tutte le righe seguita da una corrispondenza hash che rimuove i duplicati.

Se si dispone di un indice sulla colonna che si sta controllando, entrambe le query utilizzeranno tale indice e termineranno in anticipo quando viene trovato un duplicato.

piano di query con indice:

enter image description here

piano di query senza indice:

enter image description here

Problemi correlati