多字段上的T-SQL条件
我试图修改T-SQL查询中的以下子句以匹配此条件: 如果付款表中存在有效记录,则返回true,否则返回false -或- 如果多字段上的T-SQL条件,sql,sql-server,tsql,Sql,Sql Server,Tsql,我试图修改T-SQL查询中的以下子句以匹配此条件: 如果付款表中存在有效记录,则返回true,否则返回false -或- 如果IsPromoted列为true,则返回true CASE WHEN (SELECT COUNT(*) AS Expr1 FROM dbo.Payments WHERE ( EventId = dbo.Events.EventCode ) AND ( DATEADD(day, D
IsPromoted
列为true,则返回true
CASE
WHEN (SELECT COUNT(*) AS Expr1
FROM dbo.Payments
WHERE ( EventId = dbo.Events.EventCode )
AND ( DATEADD(day, DurationDays, PaymentReceived)
> GETDATE() )) > 0 THEN 'true'
WHEN ispromoted = 1 THEN 'true'
ELSE 'false'
END AS UpgradedState
有谁能提出更好的方法来实现这一点吗?我会使用存在(选择…
而不是(从…)中选择计数(*)0
:
CASE
WHEN IsPromoted = 1 THEN 'true' -- See Martin Smith's comment
WHEN EXISTS(SELECT * FROM .... dbo.Payments ...) THEN 'true'
ELSE 'false'
END
如果性能非常重要,那么我将测试解决方案:
1) 我将创建一个计算列:
ALTER TABLE dbo.Payments
ADD ColumnA AS DATEADD(day, DurationDays, PaymentReceived);
GO
2) 我会:
3) 我将改写以下内容:
CASE
WHEN IsPromoted = 1 THEN 'true' -- See Martin Smith's comment
WHEN EXITS(SELECT * FROM dbo.Payments
WHERE EventId = dbo.Events.EventCode
AND ColumnA > GETDATE()) THEN 'true'
ELSE 'false'
END
此外,我将尝试以下索引:
CREATE /*UNIQUE*/ INDEX IX_Payments_EventId_#_DurationDays_PaymentReceived
ON dbo.Payments(EventId)
INCLUDE(DurationDays, PaymentReceived);
GO
我将使用存在(选择…
而不是(从…)中选择计数(*)0
:
CASE
WHEN IsPromoted = 1 THEN 'true' -- See Martin Smith's comment
WHEN EXISTS(SELECT * FROM .... dbo.Payments ...) THEN 'true'
ELSE 'false'
END
如果性能非常重要,那么我将测试解决方案:
1) 我将创建一个计算列:
ALTER TABLE dbo.Payments
ADD ColumnA AS DATEADD(day, DurationDays, PaymentReceived);
GO
2) 我会:
3) 我将改写以下内容:
CASE
WHEN IsPromoted = 1 THEN 'true' -- See Martin Smith's comment
WHEN EXITS(SELECT * FROM dbo.Payments
WHERE EventId = dbo.Events.EventCode
AND ColumnA > GETDATE()) THEN 'true'
ELSE 'false'
END
此外,我将尝试以下索引:
CREATE /*UNIQUE*/ INDEX IX_Payments_EventId_#_DurationDays_PaymentReceived
ON dbo.Payments(EventId)
INCLUDE(DurationDays, PaymentReceived);
GO
请注意,嵌套查询不是很快。如果您想提高性能,那么使用dbo.p on EventId=p左键连接。EventCode将工作得更快。下面的案例陈述应该可以做到这一点
CASE
WHEN (DATEADD(day, p.DurationDays, p.PaymentReceived) > GETDATE() ) > 0 THEN 'true'
WHEN ispromoted = 1 THEN 'true'
ELSE 'false'
请注意,嵌套查询不是很快。如果您想提高性能,那么使用dbo.p on EventId=p左键连接。EventCode将工作得更快。下面的案例陈述应该可以做到这一点
CASE
WHEN (DATEADD(day, p.DurationDays, p.PaymentReceived) > GETDATE() ) > 0 THEN 'true'
WHEN ispromoted = 1 THEN 'true'
ELSE 'false'
+我可能应该先推荐
检查,因为这样检查比较便宜。然后子查询将位于@MartinSmith:Good suggestion Martin下。谢谢。虽然测试了这个想法,但是如果的半连接存在,那么它只会有任何区别。我认为是作为嵌套循环实现的。回答得很好。谢谢。+1可能应该先提示检查,因为这样检查比较便宜。然后子查询将位于@MartinSmith:Good suggestion Martin下。谢谢。虽然测试了这个想法,但是如果的半连接存在,那么它只会有任何区别。我认为是作为嵌套循环实现的。回答得很好。谢谢。您可能应该执行左连接而不是此计数>0,但在包含整个查询之前,我无法确定。您可能应该执行左连接而不是此计数>0,但在包含整个查询之前,我无法确定。