是否可以使用的值EXISTS
作为查询的一部分?
(请注意:不幸的是,由于客户端限制,我需要 SQLServer 2005 兼容的答案!)
因此,当返回一组结果时,其中一列是一个布尔值,它表明子查询是否会返回任何行。
例如,我想返回用户名列表以及不同的表是否包含每个用户的任何行。以下内容在语法上不正确,但希望能让您了解我的意思......
SELECT T1.[UserName],
(EXISTS (SELECT *
FROM [AnotherTable] T2
WHERE T1.[UserName] = T2.[UserName])
) AS [RowsExist]
FROM [UserTable] T1
其中结果集包含名为的列[UserName]
和布尔列称为[RowsExist]
.
显而易见的解决方案是使用CASE
,如下所示,但我想知道是否有更好的方法......
SELECT T1.[UserName],
(CASE (SELECT COUNT(*)
FROM [AnotherTable] T2
WHERE T1.[UserName] = T2.[UserName]
)
WHEN 0 THEN CAST(0 AS BIT)
ELSE CAST(1 AS BIT) END
) AS [RowsExist]
FROM [UserTable] T1
您的第二个查询语法无效。
SELECT T1.[UserName],
CASE
WHEN EXISTS (SELECT *
FROM [AnotherTable] T2
WHERE T1.[UserName] = T2.[UserName]) THEN CAST(1 AS BIT)
ELSE CAST(0 AS BIT)
END AS [RowsExist]
FROM [UserTable] T1
一般情况下没问题,将作为半连接实现。
文章CASE 表达式中的子查询 http://blogs.msdn.com/b/craigfr/archive/2006/08/23/715306.aspx进一步讨论这一点。
在某些情况下COUNT
查询实际上可以执行得更好正如这里所讨论的 https://dba.stackexchange.com/questions/46359/check-existence-with-exists-outperform-count-not/46361#46361
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)