在阅读一些SQL调优相关文档时,我发现了这个:
选择计数(*):
计算行数。 通常不恰当地用于验证记录的存在。
SELECT COUNT(*)真的那么糟糕吗?
验证记录存在的正确方法是什么?
在阅读一些SQL调优相关文档时,我发现了这个:
选择计数(*):
计算行数。 通常不恰当地用于验证记录的存在。
SELECT COUNT(*)真的那么糟糕吗?
验证记录存在的正确方法是什么?
当前回答
其他答案都很好,但是添加LIMIT 1(或等价的,以防止检查不必要的行)也会很有用。
其他回答
我宁愿不使用Count函数:
IF [NOT] EXISTS ( SELECT 1 FROM MyTable WHERE ... )
<do smth>
例如,如果你想在将user插入数据库之前检查它是否存在,查询可以是这样的:
IF NOT EXISTS ( SELECT 1 FROM Users WHERE FirstName = 'John' AND LastName = 'Smith' )
BEGIN
INSERT INTO Users (FirstName, LastName) VALUES ('John', 'Smith')
END
最好使用以下任何一种:
-- Method 1.
SELECT 1
FROM table_name
WHERE unique_key = value;
-- Method 2.
SELECT COUNT(1)
FROM table_name
WHERE unique_key = value;
第一个选项应该没有结果或只有一个结果,第二个计数应该是0或1。
您使用的文档是什么时候的?尽管您已经阅读了一些好的建议,但最近RDBMS中的大多数查询优化器都优化SELECT COUNT(*),因此尽管理论上(和旧数据库)存在差异,但在实践中您应该注意不到任何差异。
你可以使用:
SELECT 1 FROM MyTable WHERE <MyCondition>
如果没有与条件匹配的记录,则结果记录集为空。
其他答案都很好,但是添加LIMIT 1(或等价的,以防止检查不必要的行)也会很有用。
我是这么说的:
IF (EXISTS (SELECT TOP 1 FROM Users WHERE FirstName = 'John'), 1, 0) AS DoesJohnExist