T-SQL中的任何或如果存在

时间:2013-06-27 06:25:06

标签: sql tsql

我有一个表,它是外来ID和本地ID之间的映射。

我必须写一个查询来确定这个表是否是一个双射。我想出了这个

IF 1 <> ANY(
    SELECT COUNT(foreignId)
    FROM mappingTable
    GROUP BY localId
    )
BEGIN
    SELECT 'Oh noes!'
END

ELSE BEGIN
    SELECT 'Everything is fine.'
END

我的主管看了一眼并做了个鬼脸,并告诉我我应该写这个:

IF EXISTS(
    SELECT NULL
    FROM mappingTable
    GROUP BY localId
    HAVING COUNT(foreignId) <> 1
    )
BEGIN
    SELECT 'Oh noes!'
END

ELSE BEGIN
    SELECT 'Everything is fine.'
END

我的问题是这些查询中哪些是更好的风格。我很确定它们是等价的。

2 个答案:

答案 0 :(得分:11)

在SQL Server 2008上进行测试表明,这些查询不仅提供相同的结果,甚至还具有相同的查询计划。查询优化器已经知道这些查询是等效的。因此,你是对的,任何支持一方的争论都必须关注其他方面,例如风格。

就我个人而言,第二个查询更容易理解,即使第一个查询更接近于如何用英语表达搜索,因为我看到EXISTS远远超过ANY 。第一个问题让我“等等,什么?哦,是的,那是对的......”第二个问题对我来说很明显。对其他人来说可能会有所不同(也许对你而言);你应该尽量确保你的查询对你的主管和同事来说都很容易阅读。

答案 1 :(得分:2)

您的查询同样不好或同样好,具体取决于您的列上是否有索引。

如果没有索引,则会有所有行的表扫描/聚簇索引扫描,然后是删除重复项的哈希匹配。

如果您正在检查的列上有索引,则两个查询都将使用该索引,并在找到重复项时提前终止。

带索引的查询计划:

enter image description here

没有索引的查询计划:

enter image description here