如何修复 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 表达式
当我执行此查询时,出现错误 "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
.