Как исправить неверную синтаксическую ошибку в CTE? - PullRequest
0 голосов
/ 31 января 2020

Когда я делаю этот запрос, он выдает мне ошибку «неправильный синтаксис около 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

Ответы [ 3 ]

1 голос
/ 31 января 2020

Вы путаете "табличные выражения" с "общими табличными выражениями", поэтому вы смешиваете их синтаксис в нечто, что не является допустимым SQL утверждением.

Обратите внимание на разницу, и решите, какой из них использовать:

Выражение таблицы (он же «производная таблица», «встроенное представление» и т. д. c.):

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

Табличные выражения появляются в предложении FROM и называются сразу после закрывающей скобки. Оператор SELECT написан в начале.

Общее выражение таблицы (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

Как вы видите, общие выражения таблицы объявляются первыми, псевдонимы определяются перед открывающей скобкой и разделяются запятыми. Основное SELECT написано в конце. Одним из преимуществ CTE является то, что вы можете использовать общие табличные выражения много раз, в последующих CTE и в окончательном / главном SELECT.

0 голосов
/ 31 января 2020

Похоже, вы пытаетесь присоединиться непосредственно к 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
0 голосов
/ 31 января 2020

Вы объявляете CTE, но затем go прямо в объединение, для которого требуется предшествующий SELECT.

У вашего второго запроса есть ненужная конечная скобка с псевдонимом t1, но я предполагаю, что вы хотите использовать ее как производную таблицу, поэтому ей потребуется открывающая скобка до SELECT

. Возможно, вы хотите что-то вроде этого

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

et c ......

Кроме того, в качестве стороны, вы должны держаться подальше от старого синтаксиса 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
...