T-SQL选择Subselect或Default的位置

时间:2015-02-04 14:04:40

标签: sql-server

我有一个SELECT,它检索ROWS,将DATETIME字段与另一个TABLE的最高可用值进行比较。 两个表具有以下结构

DeletedRecords
 - Id (Guid)
 - RecordId (Guid)
 - TableName (varchar)
 - DeletionDate (datetime)

另一个使用以下结构跟踪同步的表

SynchronizationLog
 - Id (Guid)
 - SynchronizationDate (datetime)

为了获取自上次同步以来已删除的所有RECORDS,我运行以下SELECT:

SELECT 
   [Id],[RecordId],[TableName],[DeletionDate] 
FROM 
   [DeletedRecords]
WHERE 
   [TableName] = '[dbo].[Person]' 
   AND [DeletionDate] > 
   (SELECT TOP 1 [SynchronizationDate] 
    FROM [dbo].[SynchronizationLog] 
    ORDER BY [SynchronizationDate] DESC)

如果我还没有可用的同步,则会出现问题,T-SQL SELECT不返回任何行,而它应该返回所有行,因为没有可用的同步记录。 是否有像COALESCE这样的T-SQL函数可以与DateTime一起使用?

1 个答案:

答案 0 :(得分:1)

你的子查询应该是这样的:

SELECT COALESCE(MAX([SynchronizationDate]), '0001-01-01')
FROM [dbo].[SynchronizationLog]

它说:获取最后一个日期,但如果没有记录(或所有值都为NULL),则使用'0001-01-01'日期作为开始日期。

注意'0001-01-01'适用于DATETIME2,如果您使用旧的DATETIME数据类型,则应为'1753-01-01'

另请注意(来自https://msdn.microsoft.com/en-us/library/ms187819(v=sql.100).aspx

  

使用time,date,datetime2和datetimeoffset数据类型进行新工作。这些类型与SQL标准一致。它们更便携。 time,datetime2和datetimeoffset提供更多的秒精度。 datetimeoffset为全局部署的应用程序提供时区支持。

修改

另一种解决方案是使用NOT EXISTS(如果性能更好或更好,则必须对其进行测试):

SELECT 
   [Id],[RecordId],[TableName],[DeletionDate] 
FROM 
   [DeletedRecords] DR
WHERE 
   [TableName] = '[dbo].[Person]' 
   AND NOT EXISTS (
     SELECT 1
     FROM [dbo].[SynchronizationLog] SL
     WHERE DR.[DeletionDate] <= SL.[SynchronizationDate]
   )