我使用Microsoft SQL Server 2012.我需要检查数据库中名为SiteObjects
的表是否至少有一条记录,其中名为SiteRegionId
的列的值等于{{1} }。
如果不是必须实现某种逻辑,如果不是必须实现另一种逻辑。
这是我的实施:
22
我认为这一行:
IF EXISTS (SELECT * FROM SiteObjects WHERE SiteRegionId = 22)
BEGIN
----do what you need if exists
RETURN '0'; --not deleted
END
ELSE
BEGIN
--do what needs to be done if not
DELETE FROM SiteRegions
WHERE Id = 22;
RETURN '1';
END
无效,因为我了解它在所有表行上运行并选择SELECT * FROM SiteObjects WHERE SiteRegionId = 22
等于22的所有行。有没有办法让它更有效?如果任何行符合条件,请继续。
答案 0 :(得分:5)
不,EXISTS
足够聪明,一旦观察到一行就会返回true。并且系统知道实际上没有检索到列数据。
因此,其他答案中的建议是十多年前的遗留建议。
子查询实际上不会生成任何数据
...
- EXISTS引入的子查询的选择列表几乎总是由星号(*)组成。没有理由列出列名,因为您只是测试是否存在满足子查询中指定条件的行。
答案 1 :(得分:1)
我建议你写一下:
IF EXISTS (SELECT 1 FROM SiteObjects WHERE SiteRegionId = 22)
您不需要使用*
即,获取表的所有列以检查记录是否存在。您只需使用1
。
然而,就效率而言,两个查询,即使用*
的查询和使用1
的查询在执行时将具有几乎相同的执行计划。通常1
是首选,以使其更易于阅读。您可以按照此链接查看两个查询将如何提供相同的执行计划。 SQL SERVER – SELECT 1 vs SELECT * – An Interesting Observation
答案 2 :(得分:1)
如果您只是需要知道SiteRegionId = 22是否存在任何行,请将查询更改为SELECT TOP 1 id FROM SiteObjects WHERE SiteRegionId = 22
将id替换为索引列(主键列),这将告诉您是否有任何行,但是会通过从一行返回一列来实现。
TOP 1
部分在找到1行后停止查询,因此无需查看整个表格。