«Неправильный синтаксис» при использовании общего табличного выражения

#sql #sql-server #common-table-expression

#sql #sql-сервер #common-table-expression

Вопрос:

 WITH list_dedup (Company, duplicate_count) AS
(
     SELECT
         *,
         ROW_NUMBER() OVER (PARTITION BY Company ORDER BY Email) AS 'RowNumber'
     FROM
         Travels
)
 

Ошибка:

Сообщение 102, уровень 15, состояние 1, строка 7
Неправильный синтаксис рядом с ‘)’.

Комментарии:

1. Я думаю, что количество (и типы) столбцов в CTE должны соответствовать тому, что вы выбираете в фактическом запросе.

2. После определения необходимо иметь инструкцию, использующую CTE. например WITH list_dedup (Company, duplicate_count) AS ( ... ) SELECT * FROM list_dedup

Ответ №1:

Вам не хватает окончательного выбора для общего табличного выражения (после определения CTE):

 WITH list_dedup  (Company,duplicate_count) As
(
  select *,
         ROW_NUMBER() OVER (PARTITION BY Company ORDER by Email) As "RowNumber"
  From Travels
)
select *  
from list_dedup; 

Но этого не произойдет, потому что CTE определен как имеющий два столбца (через WITH list_dedup (Company,duplicate_count) ), но ваш выбор внутри CTE возвращает как минимум три столбца (company, email, rownumber). Вам нужно либо скорректировать определение столбца для CTE, либо полностью исключить его:

 WITH list_dedup As
(
  select *,
         ROW_NUMBER() OVER (PARTITION BY Company ORDER by Email) As "RowNumber"
  From Travels
)
select *  
from list_dedup;
 

As "RowNumber" Во внутреннем выборе также не имеет смысла, когда определен список столбцов, потому что тогда определение CTE определяет имена столбцов. Любой псевдоним, используемый внутри CTE, не будет виден за его пределами (если столбцы CTE указаны в with .. (...) as части).

Ответ №2:

Вы только что настроили свой CTE — теперь вам нужно его использовать!

 WITH list_dedup (Company, duplicate_count) AS
(
     SELECT
         *,
         ROW_NUMBER() OVER (PARTITION BY Company ORDER BY Email) AS 'RowNumber'
     FROM
         Travels
)
SELECT *
FROM list_dedup
 

Ответ №3:

;С list_dedup (Company, duplicate_count) КАК (ВЫБЕРИТЕ *, ROW_NUMBER() ПОВЕРХ (РАЗДЕЛ ПО ЗАКАЗУ компании ПО электронной почте) КАК ‘НОМЕР строки’ ИЗ Travels)

ВЫБЕРИТЕ * ИЗ list_dedup