SQL选择语法错误

时间:2010-04-20 00:12:10

标签: mysql syntax

感谢你昨天的帮助。 我现在正在尝试将昨天的查询合并到现有查询中,这样我就可以在现有查询中显示最高项目代码的报告组。但是我的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 个答案:

答案 0 :(得分:1)

使用UNION时,请将SELECT语句包装在括号中。

e.g。

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

编辑:仔细检查一下查询的怪异性,其中可能还有很多其他错误。我建议将其中的部分内容删除,并为我们提供仍然会导致语法错误的最小可能示例。

答案 1 :(得分:1)

看起来你有两个完全独立的查询,它们之间没有分号。

这就是我认为问题所在:

. . .
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()也会受到支持。如果使用MySQL,您应该学会使用LIMIT子句。

  • 尝试将多个列和多行返回的子查询放入选择列表的单个列中。

  • 如果您尝试将子查询作为选择列表的一部分,则SELECT属于子查询的前面。你也应该给它一个列别名。

  • 复杂的日期转换表达式。我建议以规范的ISO格式存储日期。

  • OVRC01OVRC02OVRC03等的原始设计。这是一个违反First Normal Form的重复组。 OCQF01OCQF02OCQF03等也是如此。

  • 我不确定您是否正确使用LIKE通配符。 *不是LIKE的标准通配符。

  • 无法解析的表命名和列命名约定。它看起来像是20世纪80年代的Oracle数据库。如果您对数据库或您尝试解决的问题一无所知,则无法推荐其他解决方案。

答案 2 :(得分:0)

看起来你有两个CTE表,但只有一个被命名。第二个开始(SELECT OTQUOT, DESC(。您可以为其命名(即将其更改为, CALC2 As (SELECT OTQUOT, DESC(...,但我不知道您实际上想要在查询的其余部分中使用此表格。