如何修复 CTE 中不正确的语法错误?

How to fix Incorrect syntax error in CTE?

当我执行此查询时,出现错误 "incorrect syntax near t1"。

如果查询不在 CTE 内,则查询有效。你怎么能在 CTE 中做到这一点?

WITH CTE
AS (
    SELECT DISTINCT t1.id
    FROM ticket t1
    WHERE...

    UNION

    SELECT t1.id
    FROM ticket t1
        ,ticket t2
    WHERE t1.id = t2.matching_ticket_id
        AND t2.id NOT IN (
            SELECT ticket_id
            FROM aa
                ,pa
            WHERE aa.id = pa.account_id
            )
    ) t1 --> incorrect syntax near t1
JOIN (
    SELECT DISTINCT t1.id
    FROM ticket t1
    WHERE t1.id NOT IN (
            SELECT ticket_id
            FROM aa
                ,pa
            WHERE aa.id = pa.account_id
            )
    ) t2 ON t2.id = t1.id --> incorrect syntax near t2

UNION

(
    SELECT DISTINCT t1.id
    FROM cd_ticket t1
    WHERE...

    UNION

    SELECT t1.id
    FROM cd_ticket t1
        ,cd_ticket t2
    WHERE t1.id = t2.matching_ticket_id
        AND t2.id NOT IN (
            SELECT ticket_id
            FROM cd_aa
                ,cd_pa
            WHERE aa.id = pa.account_id
            )
    ) t1 --> incorrect syntax near t1
JOIN (
    SELECT DISTINCT t1.id
    FROM cd_ticket t1
    WHERE t1.id NOT IN (
            SELECT ticket_id
            FROM cd_aa
                ,cd_pa
            WHERE aa.id = pa.account_id
            )
    ) t2 ON t2.id = t1.id --> incorrect syntax near t2

您声明了一个 CTE,但随后直接进入了一个需要前面 SELECT 的工会。

您的第二个查询有一个带有 t1 别名的不必要的尾随括号,但我假设您希望将其作为派生的 table,因此在 SELECT[ 之前需要一个左括号=16=]

你可能想要这样的东西

WITH CTE AS
(
    select distinct t1.id from ticket t1 where ...
)
SELECT id FROM CTE
union
SELECT * FROM 
(
select  t1.id
from    ticket t1,
        ticket t2
where   t1.id = t2.matching_ticket_id and
        t2.id not in  ( select  ticket_id from aa, pa where aa.id = pa.account_id )
)  t1

join

等等……

此外,作为一个方面,您应该避开旧的 JOIN 语法:

SELECT ticket_id
FROM   aa, pa
WHERE  aa.id = pa.account_id

并重写为

SELECT ticket_id
FROM   aa
       JOIN oa
          ON aa.id=pa.account_id

您似乎正试图直接加入 CTE;这不是他们的工作方式。

如果您想加入 CTE:

WITH CTE AS ( somequery )
SELECT stuff
FROM aTable AS a INNER JOIN CTE AS c ON a.somefield = CTE.somefield

如果您希望 CTE 表示两个连接的子查询,它们需要在 CTE 内:

WITH CTE AS (
   SELECT stuff 
   FROM (
      subquery1
   ) AS q1 
   INNER JOIN (
      subquery2
   ) AS q2 ON ....)
SELECT stuff 
FROM CTE

您将 "table expressions" 与 "common table expressions" 混淆了,因此您将两者的语法混合到不合法的 SQL 语句中。

看看区别,然后决定使用哪一个:

Table 表达式(又名 "derived table"、"inline view" 等):

select *
from (
  select ... -- my complex select #1 here
) a
join (
  select ... -- my complex select #2 here
) b on a.column_a = b.column_b

Table 表达式出现在 FROM 子句中,它们紧跟在右括号之后命名。 SELECT语句写在开头。

常见 Table 表达式 (CTE):

with 
a as (
  select ... -- my complex select #1 here
),
b as (
  select ... -- my complex select #2 here
)
select * from a join b on a.column_a = b.column_b

如你所见 Common Table 表达式先声明,别名定义在左括号之前,用逗号分隔。主要的SELECT写在最后。 CTE 的一个优点是您可以在后续的 CTE 和 final/main SELECT.

中多次使用常见的 table 表达式