【问题标题】:Access SQL to T-SQL访问 SQL 到 T-SQL
【发布时间】:2017-07-28 17:43:23
【问题描述】:

此查询在 MS Access 中有效:

SELECT 
       Firm.Adm_Firm_ID, 
       Firm.CCIS_Firm_Seqn_Nbr, 
       Firm.Firm_Name, 
       Firm.Dba_Firm_Name, 
       OHA.File_Closure_Date, 
       OHA.Adm_Qual_Flag,
       OHA.Firm_FY_End_Date,
       OHA.Report_Received_Date,
       OHA.Cognizant_Letter_Flag, 
       OHA.Audit_Type, 
       Firm.AQ_Flag,
       IIF(OHA.File_Closure_Date>=DATEADD("m", -18, Date()),"Yes","No") AS Relevant
FROM 
      dbo_Adm_Firm AS Firm 
INNER JOIN 
      dbo_Adm_OHA_Rate AS OHA ON Firm.Adm_Firm_ID = OHA.Adm_Firm_ID
WHERE 
      ((OHA.File_Closure_Date IS NOT Null) AND (OHA.File_Closure_Date>#1/1/2010#))
ORDER BY 
      Firm.Firm_Name, OHA.Firm_FY_End_Date DESC;

我尽力将其转换为 T-SQL,我在批处理脚本中调用它。

SELECT 
      Firm.Adm_Firm_ID, 
      Firm.CCIS_Firm_Seqn_Nbr, 
      Firm.Firm_Name, 
      Firm.Dba_Firm_Name, 
      OHA.File_Closure_Date, 
      OHA.Adm_Qual_Flag, 
      OHA.Firm_FY_End_Date, 
      OHA.Report_Received_Date, 
      OHA.Cognizant_Letter_Flag, 
      OHA.Audit_Type, 
      Firm.AQ_Flag, 
      IIF(OHA.File_Closure_Date>=DATEADD(m, -18, GETDATE()),'Yes','No') AS Relevant
FROM 
      dbo.Adm_Firm AS Firm 
INNER JOIN 
      dbo.Adm_OHA_Rate AS OHA ON Firm.Adm_Firm_ID = OHA.Adm_Firm_ID
WHERE 
      ((OHA.File_Closure_Date IS NOT Null) AND (OHA.File_Closure_Date>'1/1/2010'))
ORDER BY 
      Firm.Firm_Name, OHA.Firm_FY_End_Date DESC;

我在 excel 文件中得到的输出是:

消息 102,级别 15,状态 1,服务器 CH-IS-DB1,第 3 行
'>' 附近的语法不正确。

所以我相信问题出在DATEADD 方法上,但我就是不知道有什么区别。我尝试将 Date() 更改为 GetDate() 并更改字符串分隔符。有什么建议吗?

【问题讨论】:

  • 提示 1 - 添加空格以提高可读性。
  • 提示号 2 - 每个部分在单独的行中,将行注释到它的工作点,对该行进行故障排除
  • 我已经编辑了您的问题以提高可读性。接受更改或自己让眼睛更容易:)
  • 什么版本的 SQL Server?

标签: sql-server tsql ms-access


【解决方案1】:

尝试使用CASE WHEN

SELECT 
      Firm.Adm_Firm_ID, 
      Firm.CCIS_Firm_Seqn_Nbr, 
      Firm.Firm_Name, 
      Firm.Dba_Firm_Name, 
      OHA.File_Closure_Date, 
      OHA.Adm_Qual_Flag, 
      OHA.Firm_FY_End_Date, 
      OHA.Report_Received_Date, 
      OHA.Cognizant_Letter_Flag, 
      OHA.Audit_Type, 
      Firm.AQ_Flag, 
      CASE 
      WHEN OHA.File_Closure_Date >= DATEADD(m, -18, GETDATE()) THEN 'Yes'ELSE 'No' END AS Relevant
FROM 
      dbo.Adm_Firm AS Firm 
INNER JOIN 
      dbo.Adm_OHA_Rate AS OHA ON Firm.Adm_Firm_ID = OHA.Adm_Firm_ID
WHERE 
      ((OHA.File_Closure_Date IS NOT Null) AND (OHA.File_Closure_Date>'1/1/2010'))
ORDER BY 
      Firm.Firm_Name, OHA.Firm_FY_End_Date DESC;

【讨论】:

  • 谢谢,这行得通。你是想说我应该一直使用CASE WHEN 而不是IIF?
  • sql 2016之前的版本需要用case when,以后可以用IIF
  • sql Server 2012 之前的版本
  • 我还建议将您的 WHERE 条件移至您的 INNER JOIN。它们过滤 OHA 表,因此在 JOIN 中过滤掉您不需要的行而不是让所有这些行组合然后过滤会更高效。 JOIN 在 WHERE 之前运行。
猜你喜欢
  • 1970-01-01
  • 2016-01-07
  • 1970-01-01
  • 1970-01-01
  • 2023-02-08
  • 2017-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多