2013-06-27 2 views
6

У меня есть таблица, которая представляет собой сопоставление между иностранными идентификаторами и локальными идентификаторами.ЛЮБЫЕ ИЛИ ПОВТОРНЫЕ СУЩЕСТВУЮЩИЕ В T-SQL

Мне пришлось написать запрос, чтобы узнать, является ли эта таблица биекцией. Я придумал этот

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

ELSE BEGIN 
    SELECT 'Everything is fine.' 
END 

Мой руководитель взял один взгляд на это и скривился, и сказал мне, что я должен был бы написать вместо этого:

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 

Мой вопрос просто, какой из этих запросов лучше стиль , Я почти уверен, что они эквивалентны.

+0

Почему бы не использовать ограничение уникальности на столе? Подобно UNIQUE (localId, foreignId), так что каждое сопоставление может быть только однократно вставлено. Проверка выполняется движком базы данных, и вам не нужно писать какой-либо код. –

+0

@ JennyO'Reilly Я пытаюсь проверить разумность данных, полученных из внешних источников. –

+0

Затем создайте таблицу и ограничение сначала и попробуйте вставить данные впоследствии. Ваша система БД должна выдать ошибку, если данные неверны. :-) –

ответ

8

Тестирование на SQL Server 2008 показывает, что эти запросы не только дают одинаковые результаты, но даже имеют одинаковые планы запросов. Оптимизатор запросов уже знает, что эти запросы эквивалентны. Таким образом, вы правы, что любые аргументы в пользу одного над другим должны будут сосредоточиться на других аспектах, таких как стиль.

Для меня лично второй вопрос легче понять, хотя первый запрос более подробно следует за тем, как вы будете искать поиск на английском языке, потому что я видел EXISTS намного больше, чем ANY. Первый запрос заставляет меня пойти «подождать, что? О да, это правильно ...» Второе сразу очевидно для меня. Это может быть другим для других (возможно, для вас); вы должны попытаться убедиться, что ваши запросы так же легко читаются для вашего руководителя и коллег.

2

Ваши запросы одинаково плохи или одинаково хороши в зависимости от того, есть ли у вас индекс в столбце или нет.

Без индекса будет отображаться сканирование по индексу/кластерному сканированию по всем строкам, за которым следует совпадение, которое удаляет дубликаты.

Если у вас есть указатель на столбец, который вы проверяете, оба запроса будут использовать этот индекс и заканчиваться раньше, когда будет найден дубликат.

план запроса с индексом:

enter image description here

план запроса без индекса:

enter image description here