【问题标题】:SQL Server syntax error when joining CTEs加入 CTE 时出现 SQL Server 语法错误
【发布时间】:2015-08-19 23:19:29
【问题描述】:

我使用的是 SQL Server 2014,但在下面的 SQL 查询中遇到问题。似乎某处存在语法错误,但我找不到它。

我正在加入来自两个不同视图的两个选择查询,即ReservationListARACCOUNT

USE MyDatabase

;WITH q1 AS (
    select * 
    from ReservationList
    WHERE [Market Segment Code] <> 'COMP' AND 
    NOT (Status] = 'CANCELED' OR [Status] = 'NOSHOW' OR [Status] = 'WAITLIST') AND 
    NOT [Departure Date] < '2014-07-01' AND 
    NOT [Market Segment Code] = 'COMP' AND 
    NOT [Arrival Date] = [Departure Date]
)a

q2 AS (
    SELECT 
        [PMSConfirmationNumber],
        [FOC ACCOUNT],
        [AR ACCOUNT NAME]
    FROM 
        ARACCOUNT
)b

Select 
    q1.* 
from 
    q1
    JOIN q2 ON q1.PmsConfirmatioNnumber = q2.foh_PmsConfirmationNumber

错误信息如下:

Msg 102, Level 15, State 1, Line 21
Incorrect syntax near 'a'.
Msg 102, Level 15, State 1, Line 29
Incorrect syntax near ')'.

我还需要从 ARACCOUNT 中选择的字段出现在最终输出中。如何修改我的查询以包含我的 q2 选择?

【问题讨论】:

  • 在您的第一个 CTE 上将 a 替换为 ,)a 应该是 ),
  • 我收到以下错误消息:消息 102,级别 15,状态 1,第 29 行 ')' 附近的语法不正确。它现在指的是b。
  • CTE 名称出现之前 AS,不需要像ab 这样的别名。
  • 您似乎使用得不多。如果您只使用正确的运算符,您的代码可能会更容易阅读,例如 "NOT =" 和 "NOT = " vs "!="

标签: sql sql-server select join syntax-error


【解决方案1】:

您在两个 CTE 之间缺少逗号。此外,删除别名 - 定义 CTE 时不需要它们:

;WITH q1 AS (


 select * 

 from ReservationList

 WHERE [Market Segment Code] <> 'COMP'

 AND NOT ([Status] = 'CANCELED' OR [Status] = 'NOSHOW' OR [Status] = 'WAITLIST')

 AND NOT [Departure Date] < '2014-07-01'

 AND NOT [Market Segment Code] = 'COMP'

 AND NOT [Arrival Date] = [Departure Date]

), -- alias dropped and comma added here

q2 AS (

SELECT [PMSConfirmationNumber],[FOC ACCOUNT],[AR ACCOUNT NAME]

 FROM ARACCOUNT

) -- alias dropped

Select q1.*, q2.* from q1
JOIN q2 ON q1.PmsConfirmatioNnumber = q2.foh_PmsConfirmationNumber

【讨论】:

  • 谢谢。工作得很好!但是,我没有得到我从 q2 中选择的字段!如何更改查询以解决此问题?
猜你喜欢
  • 2016-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-10
  • 2019-08-28
  • 2019-10-05
相关资源
最近更新 更多