Подтвердить что ты не робот

Sql: как правильно проверить, существует ли запись

Чтение некоторой документации по SQL Tuning Я нашел это:

Select count(*):
- подсчитывает количество строк - Часто неправильно используется для проверки существования записи

Является ли Select count(*) действительно так плохо?

Каков правильный способ проверки существования записи?

4b9b3361

Ответ 1

Лучше использовать одно из следующих:

-- Method 1.
SELECT 1
FROM table_name
WHERE unique_key = value;

-- Method 2.
SELECT COUNT(1)
FROM table_name
WHERE unique_key = value;

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

Сколько лет документации вы используете? Несмотря на то, что вы прочитали хороший совет, большинство оптимизаторов запросов в недавних СУБД все равно оптимизируют SELECT COUNT(*), поэтому, хотя теоретические различия (и более старые базы данных) существуют, вы не должны замечать никакой разницы на практике.

Ответ 2

Я бы предпочел не использовать функцию Count вообще:

IF [NOT] EXISTS ( SELECT 1 FROM MyTable WHERE ... )
     <do smth>

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

IF NOT EXISTS ( SELECT 1 FROM Users WHERE FirstName = 'John' AND LastName = 'Smith' )
BEGIN
    INSERT INTO Users (FirstName, LastName) VALUES ('John', 'Smith')
END

Ответ 3

Вы можете использовать:

SELECT 1 FROM MyTable WHERE <MyCondition>

Если запись не соответствует условию, приведенный набор записей пуст.

Ответ 4

Другие ответы неплохие, но было бы полезно добавить LIMIT 1 (или эквивалент, чтобы предотвратить проверку ненужные строки.

Ответ 5

Вы можете использовать:

SELECT COUNT(1) FROM MyTable WHERE ... 

или

WHERE [NOT] EXISTS 
( SELECT 1 FROM MyTable WHERE ... )

Это будет более эффективно, чем SELECT *, поскольку вы просто выбираете значение 1 для каждой строки, а не все поля.

Также существует небольшая разница между COUNT (*) и COUNT (название столбца):

  • COUNT(*) будет считать все строки, включая нули
  • COUNT(column name) будет считать только непустые вхождения имени столбца

Ответ 6

SELECT COUNT(1) FROM MyTable WHERE ...

будет проходить через все записи. Вот почему это плохо для использования в качестве записи.

Я бы использовал

SELECT TOP 1 * FROM MyTable WHERE ...

После того, как вы найдете 1 запись, она завершит цикл.

Ответ 7

Ты можешь использовать:

SELECT 1 FROM MyTable WHERE... LIMIT 1

Используйте select 1 чтобы предотвратить проверку ненужных полей.

Используйте LIMIT 1 чтобы предотвратить проверку ненужных строк.

Ответ 8

Я использую этот способ:

IIF(EXISTS (SELECT TOP 1 1 
                FROM Users 
                WHERE FirstName = 'John'), 1, 0) AS DoesJohnExist

Ответ 9

Другой вариант:

SELECT CASE
    WHEN EXISTS (
        SELECT 1
        FROM [MyTable] AS [MyRecord])
    THEN CAST(1 AS BIT) ELSE CAST(0 AS BIT)
END