Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 有效地检查记录集中是否存在多行_Sql_Sql Server_Sql Server 2008 R2 - Fatal编程技术网

Sql 有效地检查记录集中是否存在多行

Sql 有效地检查记录集中是否存在多行,sql,sql-server,sql-server-2008-r2,Sql,Sql Server,Sql Server 2008 R2,我使用的是SQLServer2008R2,我试图找到一种有效的方法来测试一个表中是否存在多个与条件匹配的行 做这件事的天真方法是计数: IF ( SELECT COUNT(*) FROM Table WHERE Column = <something> ) > 1 BEGIN ... END 但这需要实际计算一个计数,这是浪费。我只想测试一个以上 我唯一想到的是排名前2位的人数: IF ( SELE

我使用的是SQLServer2008R2,我试图找到一种有效的方法来测试一个表中是否存在多个与条件匹配的行

做这件事的天真方法是计数:

IF  (   SELECT  COUNT(*)
        FROM    Table
        WHERE   Column  = <something>
    )   > 1 BEGIN
    ...
END
但这需要实际计算一个计数,这是浪费。我只想测试一个以上

我唯一想到的是排名前2位的人数:

IF  (   SELECT  COUNT(*)
        FROM    (   SELECT  TOP 2   0   x
                    FROM    Table
                    WHERE   Column  = <something>
                )   x
    )   > 1 BEGIN
    ...
END

这是笨重的,需要对文档进行注释。还有更简洁的方法吗?

如果表中有一个PK,您正在检查>1行,那么可以嵌套另一个EXISTS子句。不确定这是否更快,但它实现了您的记录结果。例如,假设具有PK命名ID的站点表可以具有零到多个具有PK命名ID的位置表记录,则位置具有FK StationID,并且您希望找到至少具有两个位置的站点:

SELECT s.ID
FROM Station s
WHERE EXISTS (
    SELECT 1
    FROM Location L
    WHERE L.StationID = s.ID
    AND EXISTS (
        SELECT 1
        FROM Location L2
        WHERE L2.StationID = L.StationID
        AND L2.ID <> L.ID
    )
)

我有以下解决方案与大家分享,这可能是更轻的性能。
我假设您正在尝试获取第一条记录,并在确保SQL选择返回单个记录后对其进行处理。因此,继续并获取它,但一旦这样做,请立即尝试获取下一条记录,如果成功,您就会知道存在多条记录,并且可以启动异常处理逻辑。否则,您仍然可以处理单个记录。

不能超过一列。多行。如中所示,表中是否有2行与我的搜索条件匹配。SQL Server具有有效的语法来检查是否存在任何行-use EXISTS。我正在寻找一个表达式来检查表是否有多个,而不计算整个集合的计数,这是不必要的昂贵。>>但这需要实际计算计数,这是浪费我不关心计数操作本身。它是实际扫描行的IO。假设最坏的情况是没有索引的列,我想要一个完整的表扫描,在它到达第二行后退出。@Pete好吧,根据我所看到的计划,在前2行计数更有效,因为它会短路。此外,在一个无关的问题上投70票仍然是无关的。这在一个完整的命令式过程解决方案C、Java、PHP中是可以的,但在一个集合范式SQL中不是很好,请不要提及游标/rbar。如果你的应用程序是这样工作的,它一定有一个可怕的DB往返效率