Синтаксическая ошибка SQL Select - PullRequest
1 голос
/ 20 апреля 2010

спасибо за вашу помощь вчера. Сейчас я пытаюсь включить запрос вчерашнего дня в существующий запрос, чтобы я мог показать группу отчетов с наивысшим кодом элемента в существующем запросе ... но у меня есть синтаксическая ошибка где-то в моем операторе Select. ОШИБКА: ключевое слово SELECT не ожидается.

Я пробовал ставить скобки в каждом возможном месте, но все равно не ходил .. Не могли бы вы помочь? (ps-весь этот вопрос давал мне кошмары!)

WITH CALC1 AS (SELECT OTQUOT, OTIT01 AS ITEMS, ROUND(OQCQ01 * OVRC01,2) AS COST
FROM  @LIB@.RTQOTA
WHERE OTIT01 <> ''

UNION ALL

SELECT OTQUOT, OTIT02 AS ITEMS, ROUND(OQCQ02 * OVRC02,2) AS COST
FROM  @LIB@.RTQOTA
WHERE OTIT02 <> ''

UNION ALL

SELECT OTQUOT, OTIT03 AS ITEMS, ROUND(OQCQ03 * OVRC03,2) AS COST
FROM @LIB@.RTQOTA
WHERE OTIT03 <> ''

UNION ALL

SELECT OTQUOT, OTIT04 AS ITEMS, ROUND(OQCQ04 * OVRC04,2) AS COST
FROM @LIB@.RTQOTA
WHERE OTIT04 <> ''

UNION ALL

SELECT OTQUOT, OTIT05 AS ITEMS, ROUND(OQCQ05 * OVRC05,2) AS COST
FROM @LIB@.RTQOTA
WHERE OTIT05 <> ''

UNION ALL

SELECT OTQUOT, OTIT06 AS ITEMS, ROUND(OQCQ06 * OVRC06,2) AS COST
FROM @LIB@.RTQOTA
WHERE OTIT06 <> ''

UNION ALL

SELECT OTQUOT, OTIT07 AS ITEMS, ROUND(OQCQ07 * OVRC07,2) AS COST
FROM @LIB@.RTQOTA
WHERE OTIT07 <> ''

UNION ALL

SELECT OTQUOT, OTIT08 AS ITEMS, ROUND(OQCQ08 * OVRC08,2) AS COST
FROM @LIB@.RTQOTA
WHERE OTIT08 <> ''

UNION ALL

SELECT OTQUOT, OTIT09 AS ITEMS, ROUND(OQCQ09 * OVRC09,2) AS COST
FROM @LIB@.RTQOTA
WHERE OTIT09 <> ''

UNION ALL

SELECT OTQUOT, OTIT10 AS ITEMS, ROUND(OQCQ10 * OVRC10,2) AS COST
FROM @LIB@.RTQOTA
WHERE OTIT10 <> ''


)

(SELECT OTQUOT, DESC

FROM ( 
  SELECT OTQUOT, ITEMS, B.IXRPGP AS GROUP, C.OTRDSC AS DESC, COST, ROW_NUMBER() OVER 

(ORDER BY COST DESC) AS RN 

  FROM CALC1 AS A INNER JOIN @LIB@.ITMCON AS B ON (A.ITEMS = B.IKITMC) INNER JOIN 

DATAGRP.GDSGRP AS C ON (B.IXRPGP = C.OKRPGP)


) T 

WHERE T.RN >= 1)

SELECT 

A.OKPBRN,

A.OCAREA,

A.OTCCDE,

A.OTCNAM,

A.OTSMAN,

A.OKPBRN||A.OAPNUM AS OTQUOT,

A.OTONUM,

A.OTCAD1,

A.OTCAD2,

A.OTCAD3,

A.OTPCDE,

A.OTDEL1,

A.OTDEL2,

A.OTDEL3,

CHAR(DATE(CASE WHEN SUBSTR(A.ODOQDT,5,4) = '0000' THEN '0001' ELSE SUBSTR(A.ODOQDT,5,4) 

END ||'-'||

CASE WHEN SUBSTR(A.ODOQDT,4,2) = '00' THEN '01' ELSE SUBSTR(A.ODOQDT,3,2) END ||'-'||

CASE WHEN SUBSTR(A.ODOQDT,1,2) = '00' THEN '01' ELSE SUBSTR(A.ODOQDT,1,2) END), ISO) AS 

ODOQDT_CCYYMMDD,

CHAR(DATE(CASE WHEN SUBSTR(A.ODDELD,7,2) = '' THEN '0001' ELSE '20'||SUBSTR(A.ODDELD,7,2) 

END ||'-'||

CASE WHEN SUBSTR(A.ODDELD,4,2) = '' THEN '01' ELSE SUBSTR(A.ODDELD,4,2) END ||'-'||

CASE WHEN SUBSTR(A.ODDELD,1,2) = '' THEN '01' ELSE SUBSTR(A.ODDELD,1,2) END), ISO) AS 

ODDELD_CCYYMMDD,

B.DESC,

A.OVQTVL

FROM 

@LIB@.RTQCTL AS A INNER JOIN CALC1 AS B ON (A.OKPBRN||A.OAPNUM = B.OTQUOT)

WHERE 

A.OKPBRN = '@OKPBRN@'

AND A.OTCCDE NOT LIKE '*DEP%'

AND CHAR(DATE(CASE WHEN SUBSTR(A.ODOQDT,5,4) = '0000' THEN '0001' ELSE SUBSTR

(A.ODOQDT,5,4) END ||'-'||

CASE WHEN SUBSTR(A.ODOQDT,4,2) = '00' THEN '01' ELSE SUBSTR(A.ODOQDT,3,2) END ||'-'||

CASE WHEN SUBSTR(A.ODOQDT,1,2) = '00' THEN '01' ELSE SUBSTR(A.ODOQDT,1,2) END), ISO) >=

CHAR(CURDATE() - 3 MONTH, ISO)

AND A.OCQF01 = '0'
AND A.OCQF02 = '0'
AND A.OCQF04 = '0'
AND A.OCQF05 = '0'
AND A.OCQF06 = '0'
AND A.OCQF07 = '0'
AND A.OCQF08 = '0'
AND A.OCQF09 = '0'
AND A.OCQF10 = '1'
AND A.OTCGRP LIKE 'S/%'

ORDER BY 
A.OTSMAN ASC,
A.OVQTVL DESC,
CHAR(DATE(CASE WHEN SUBSTR(A.ODDELD,7,2) = '' THEN '0001' ELSE '20'||SUBSTR(A.ODDELD,7,2) END ||'-'||
CASE WHEN SUBSTR(A.ODDELD,4,2) = '' THEN '01' ELSE SUBSTR(A.ODDELD,4,2) END ||'-'||
CASE WHEN SUBSTR(A.ODDELD,1,2) = '' THEN '01' ELSE SUBSTR(A.ODDELD,1,2) END),ISO) ASC

Ответы [ 3 ]

1 голос
/ 20 апреля 2010

Похоже, у вас есть два совершенно разных запроса, без точки с запятой между ними.

Здесь я думаю, что проблема в следующем:

. . .
WHERE T.RN >= 1)

SELECT A.OKPBRN, A.OCAREA, A.OTCCDE, A.OTCNAM, A.OTSMAN,
. . .

Это действительно поможет, когда вы будете задавать вопросы, чтобы определить марку и версию базы данных, которую вы используете. Различные базы данных поддерживают различные функции языка SQL, поэтому правильное решение сильно зависит от используемой вами технологии. Отметьте свой вопрос маркой, которую вы используете.

В вашем запросе много неправильного:

  • MySQL не поддерживает WITH общие табличные выражения. Именно это заставило меня подумать, что вы используете Oracle или Microsoft SQL Server, когда вчера задали другой вопрос, связанный с этим запросом.

  • MySQL не поддерживает оконную функцию ROW_NUMBER(). Приношу свои извинения за предложение использовать эту функцию. Я предполагал, что вы используете базу данных, поддерживающую WITH, поэтому я предположил, что ROW_NUMBER() также будет поддерживаться. Вы должны научиться использовать предложение LIMIT, если вы используете MySQL.

  • Попытка поместить подзапрос, который возвращает несколько столбцов и несколько строк, в один столбец вашего списка выбора.

  • Если вы пытаетесь сделать подзапрос частью списка выбора, тогда SELECT принадлежит перед подзапросом. Вы должны также дать ему псевдоним столбца.

  • Сложные выражения преобразования даты. Я бы рекомендовал хранить даты в канонической форме ISO.

  • Оригинальный дизайн OVRC01, OVRC02, OVRC03 и т. Д. Это повторяющаяся группа, которая нарушает Первая нормальная форма . То же самое верно для OCQF01, OCQF02, OCQF03 и т. Д.

  • Я не уверен, что вы правильно используете LIKE подстановочные знаки. * не является стандартным подстановочным знаком для LIKE.

  • Соглашения о наименовании неразборчивых имен таблиц и столбцов. Это похоже на базу данных Oracle 1980-х годов. Не зная ничего о вашей базе данных или проблеме, которую вы пытаетесь решить, невозможно порекомендовать другое решение.

1 голос
/ 20 апреля 2010

При использовании UNION заключите операторы SELECT в скобки.

, например

(SELECT * FROM foo)
UNION ALL
(SELECT * FROM bar)

Редактировать: При более внимательном рассмотрении этой чудовищности запроса, вероятно, в нем есть множество других ошибок. Я предлагаю разорвать его части и предоставить нам наименьший возможный пример, который все еще вызывает синтаксическую ошибку.

0 голосов
/ 20 апреля 2010

Похоже, у вас есть две таблицы CTE, но названа только одна. Второй начинается (SELECT OTQUOT, DESC(. Вы могли бы назвать его (то есть, изменить его на , CALC2 As (SELECT OTQUOT, DESC(..., но у меня нет ни малейшего представления, где вы на самом деле хотите использовать эту таблицу в остальной части вашего запроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...