【问题标题】:Get a syntax error when doing a Common Table Expression执行公用表表达式时出现语法错误
【发布时间】:2018-10-31 15:11:10
【问题描述】:

我写了以下代码:

WITH b AS 
(
    SELECT * 
    FROM [Core].[dbo].[SalesAccount] 
    WHERE [SalesAccount].[RecordUpdateDate] > 2014-07-15
) 
a AS
(
    SELECT * 
    FROM [Core].[dbo].[SalesActivity]
) 
SELECT * 
FROM a 
INNER JOIN b ON a.SalesAccountSFID = b.SalesAccountSFID

我得到这个基本上是对这里查询的修改:https://towardsdatascience.com/how-to-ace-data-science-interviews-sql-b71de212e433

对于我的生活,我无法理解为什么它会引发错误?

消息 102,第 15 级,状态 1,第 2 行
'a' 附近的语法不正确。

【问题讨论】:

  • 您的链接在“The proper way to ex...”中有一点错误。 ) a 之间缺少逗号。但在它出现在其他代码部分之前..
  • CTE 有一个很大的优势,你可以给他们起名字。不要用ba 之类的名称来浪费它。那么直接加入表格会更好..
  • 谢谢。我在下面提供的答案中添加了评论。你们是否同意文章所说的,尽管优点是使用公用表表达式查询速度更快,因为它过滤掉了进行连接的行数
  • 请阅读minimal reproducible example重新编码问题。请在新帖子中提出新问题,而不是在 cmets 中。对文本使用文本,而不是图像/链接。使帖子自成一体。 (所以这里的链接是可以的,但是对于 post re“更快”,请使用带有信用的报价。) PS“更快”取决于优化器和许多因素。研究您的 DBMS 版本。通常还有 DBMS 查询优化/实现。
  • 我目前的一般评论是“更好”/“最好”等:除非定义它,否则工程中没有“更好”/“最好”之类的东西。同样不幸的是,所有合理的实际定义都需要大量的经验,以及与对细节的混乱敏感度相互作用的大量因素。进行简单的设计。当您通过测量证明您可以想到的设计和所有替代方案都存在问题时(无论当时意味着什么),然后提出一个非常具体的问题。这也应该定义“更好”/“最好”。 meta.stackexchange.com/q/204461

标签: sql sql-server join common-table-expression


【解决方案1】:

你可能只是少了一个逗号:

with b as (
      SELECT *
      FROM [Core].[dbo].[SalesAccount]
      WHERE [SalesAccount].[RecordUpdateDate] > '2014-07-15'
     ),
     a as (
      SELECT *
      FROM [Core].[dbo].[SalesActivity]
     ) 
SELECT *
FROM a INNER JOIN
     b
     on a.SalesAccountSFID = b.SalesAccountSFID;

没有理由为此使用 CTE。我觉得这要简单得多:

SELECT sa.*, sact.*
FROM [Core].[dbo].[SalesAccount] sa INNER JOIN
     [Core].[dbo].[SalesActivity] sact
     on sa.SalesAccountSFID = sact.SalesAccountSFID
WHERE a.RecordUpdateDate > '2014-07-15';

请注意,我还在日期常量周围加上了单引号。

【讨论】:

  • 谢谢!该链接没有显示逗号,所以我不知道它属于那里。我知道另一种方式,它显然更简单。然而,该文章指出,使用公用表表达式的方式更快,因为它在连接之前而不是之后过滤掉。你不同意吗?
  • @mkheifetz。 . .在 SQL Server 中,我想他们会有相同的查询计划。第二个更短更清晰。
  • 谢谢。你能解释一下为什么你会这样认为吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多