2013-06-27 10 views
6

Mam tabelę, która jest mapowaniem między identyfikatorami obcymi i identyfikatorami lokalnymi.DOWOLNE lub JEŻELI ISTNIEJĄ w T-SQL

Musiałem napisać zapytanie, aby dowiedzieć się, czy ta tabela jest biodem. Wpadłem na ten

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

ELSE BEGIN 
    SELECT 'Everything is fine.' 
END 

Mój przełożony spojrzał na to i skrzywił się i powiedział mi, że powinienem napisać to w zamian:

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 

Moje pytanie jest po prostu które z tych pytań jest lepszy styl . Jestem prawie pewien, że są one równoważne.

+0

Dlaczego nie wykorzystać ograniczenia UNIQUE na stole? Podobnie jak UNIQUE (localId, foreignId), dzięki czemu każde mapowanie może być tylko raz odmierzane. Sprawdzanie odbywa się za pomocą silnika bazy danych i nie trzeba pisać żadnego kodu. –

+0

@ JennyO'Reilly Próbuję sprawdzić poprawność danych otrzymanych z zewnętrznych źródeł. –

+0

Następnie stwórz najpierw tabelę i wiązanie, a następnie spróbuj wstawić dane. Twój system DB powinien zgłosić błąd, jeśli dane nie są poprawne. :-) –

Odpowiedz

8

Testowanie w SQL Server 2008 pokazuje, że te zapytania nie tylko dają identyczne wyniki, ale nawet mają identyczne plany zapytań. Optymalizator zapytań już wie, że te zapytania są równoważne. Masz rację, więc każdy argument faworyzujący jeden z drugim będzie musiał skupić się na innych aspektach, takich jak styl.

Osobiście, drugie zapytanie jest łatwiejsze do zrozumienia, mimo że pierwsze zapytanie dokładniej śledzi sposób wyrażenia wyszukiwania w języku angielskim, ponieważ widziałem już ponad EXISTS więcej niż ANY. Pierwsze pytanie sprawia, że ​​zaczynam "czekać, co?" O tak, to prawda ... "Drugi jest od razu dla mnie oczywisty. Może być różny dla innych (być może dla ciebie); powinieneś postarać się, aby twoje zapytania były tak łatwe do odczytania dla twojego przełożonego i współpracowników.

2

Twoje zapytania są równie złe lub równie dobre w zależności od tego, czy masz indeks w kolumnie, czy nie.

Bez indeksu zostanie wyświetlony skan tabeli/indeks klastrowany wszystkich wierszy, a następnie dopasowanie haszy, które usuwa duplikaty.

Jeśli masz indeks sprawdzanej kolumny, oba zapytania będą używać tego indeksu i zostaną zakończone wcześnie po znalezieniu duplikatu.

Plan Zapytanie o indeksie:

enter image description here

planu kwerend bez index:

enter image description here

Powiązane problemy