这做了我想要的:
SELECT a.*,
IIF(l.Id IS NOT NULL,
CAST(1 AS BIT),
CAST(0 AS BIT)) AS IsLatest
FROM [A] a
LEFT JOIN [LatestA] l on (l.Id = a.Id)
LatestA
是一个仅包含最新A
的视图。
但是,我觉得IIF(..., TRUE, FALSE)
很愚蠢。有没有更好的方法来测试LatestA
中Id
的存在?
您的查询很好。某些 RDBMS 具有将谓词的结果转换为布尔值的快捷方式,但不能将 SQL Server 转换为布尔值。
您可以稍微简化一下,如下所示:
SELECT
a.*,
CASE WHEN l.Id IS NULL THEN 0 ELSE 1 END AS IsLatest
FROM [A] a
LEFT JOIN [LatestA] l on l.Id = a.Id
请注意,我使用了CASE
表达式而不是IIF()
函数:我更喜欢它,因为它是标准的SQL。我还发现在这里使用IS NULL
比IS NOT NULL
更简单。
如果您出于某种原因确实想返回BIT
,那么:
SELECT
a.*,
CAST(CASE WHEN l.Id IS NULL THEN 0 ELSE 1 END AS BIT) AS IsLatest
FROM [A] a
LEFT JOIN [LatestA] l on l.Id = a.Id
T-SQL不允许你使用布尔表达式作为整数值(就像MySQL一样(,因为它有第三个可能的布尔值(UNKNOWN
(,所以你被困在你所拥有的东西上。您可以稍微简化一下:
SELECT a.*,
CAST(IIF(l.Id IS NOT NULL, 1, 0) AS BIT) AS IsLatest
FROM [A] a
LEFT JOIN [LatestA] l on (l.Id = a.Id)
你可以使用 EXISTS 运算符,它用于检查记录是否存在
if exists ([query for ID])
BEGIN
[Quert from another table]
END