如何有效地检查表是不是为空?
Posted
技术标签:
【中文标题】如何有效地检查表是不是为空?【英文标题】:How to efficiently check if a table is empty?如何有效地检查表是否为空? 【发布时间】:2013-06-24 20:39:50 【问题描述】:在我目前正在编写的程序中,我需要检查一个表是否为空。我目前只有一个基本的 SQL 执行语句,即
Count(asterisk) from Table
然后我有一个 fetch 方法来抓取这一行,将 Count(asterisk)
放入一个参数中,以便我可以检查它(如果 count(*) count(asterisk) 将返回大约 11,000 行。这样的事情会更有效率吗?
select count(*)
from (select top 1 *
from TABLE)
但我无法让它在 Microsoft SQL Server 中工作
这将返回 1 或 0,我可以在执行语句时在我的编程语言中对此进行检查,并获取 count 参数以查看 TABLE 是否为空。
欢迎任何 cmets、想法或疑虑。
【问题讨论】:
您永远不必问“这会不会更有效” - SQL Server 为您提供了大量工具来评估查询性能(执行计划、DMV 和 DMO、分析器跟踪等),例如你可以从你自己的环境中得到一个明确的答案。使用代表您的生产环境的数据,尝试几种查询方式并选择产生最佳结果的一种。 刚接触 Microsoft SQL Server,不熟悉这些工具。我会更多地研究你提到的工具。感谢您的帮助。 【参考方案1】:您正在寻找表是否为空的指示。因为那个 SQL 有 EXISTS 关键字。 如果您在存储过程中执行此操作,请使用以下模式:
IF(NOT EXISTS(SELECT 1 FROM dbo.MyTable))
BEGIN
RAISERROR('MyError',16,10);
END;
如果您让指标返回以在应用内采取相应行动,请使用以下模式:
SELECT CASE WHEN EXISTS(SELECT 1 FROM dbo.MyTable) THEN 0 ELSE 1 END AS IsEmpty;
虽然大多数其他响应也会产生预期的结果,但它们似乎掩盖了意图。
【讨论】:
NOT Exists ...
周围的括号 - () - 不是强制性的。这是检查表中是否存在行的正确工具。
@Stoleg,你说得对,()
不是强制性的。这只是我采用的一种模式,总是将IF
条件包装到()
中,因为大多数其他语言都需要它。【参考方案2】:
你可以试试这样的:
select count(1) where exists (select * from t)
在SQLFiddle上测试
【讨论】:
+1 。 . .我碰巧喜欢这种方法,因为它是标准 SQL。 @Stoleg 因为要求选择 1 或 0,如果表为空,select 1
将不返回任何行。
@mustaccio 我很抱歉!确实如此!【参考方案3】:
我想写关于 EXISTS
的文章,但 Sebastian Meine 写得更快。虽然我更喜欢使用EXISTS
,但还有一种方法。
SELECT rows
FROM sys.partitions
WHERE object_id = object_id('MyTableName')
AND partition_number = 1
【讨论】:
【参考方案4】:请在检查是否存在时使用前 1,因为没有它,您将拥有与记录数一样多的“一”:
IF NOT EXISTS(select top 1 1 from Table)
BEGIN
RAISERROR('Error',0,1);
END;
【讨论】:
【参考方案5】:这似乎是一种奇怪的方式来获得你想要的东西。你能改用HAVING
吗?
SELECT id, name FROM TABLE
GROUP BY id, name
HAVING COUNT(*) > 0
【讨论】:
【参考方案6】:你的变化很好。您只需要子查询上的别名:
select count(*)
from (select top 1 *
from TABLE
) t
【讨论】:
谢谢戈登。我通常在 MS Access 中编写查询,但不知道我必须在子查询上创建别名,所以这非常有帮助。【参考方案7】:IF EXISTS 可用于检查表是否为空。
IF EXISTS (select * from YourTable)
SELECT 'Table is not empty'
ELSE
SELECT 'Table is empty'
【讨论】:
以上是关于如何有效地检查表是不是为空?的主要内容,如果未能解决你的问题,请参考以下文章
带有 Sqlite 的 Android - 如何检查表是不是存在以及是不是为空