Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
多字段上的T-SQL条件_Sql_Sql Server_Tsql - Fatal编程技术网

多字段上的T-SQL条件

多字段上的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

我试图修改T-SQL查询中的以下子句以匹配此条件:

如果付款表中存在有效记录,则返回true,否则返回false

-或-

如果
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,但在包含整个查询之前,我无法确定。