0

因此,我收到此错误消息:

EDT ERROR:  syntax error at or near "union" at character 436

有问题的查询是一个大查询,由 12 个较小的查询组成,所有查询都通过 UNION ALL 连接在一起,每个小查询都有两个内部连接语句。所以,像:

SELECT table.someid as id
    ,table.lastname as name
    ,table2.groupname as groupname
    , 'Leads     ' as Type
from table 
inner join table3 on table3.specificid = table.someid
INNER JOIN table2 on table3.specificid=table2.groupid
where table3.deleted=0 
 and table.someid > 0
 and table2.groupid in ('2','3','4')
LIMIT 5 
UNION all 
query2....

请注意,table2 和 table3 在每个查询中都是相同的表,并且我认为 table2 和 table3 中的字段也相同。

快速提问(我对这一切还是有点陌生​​):
“Leads”作为 Type 是什么意思?与 AS 之前的其他语句不同,这个语句不像 table.something 那样写。
快速编辑问题:table2.groupid in ('2','3','4') 是什么意思?

我一一检查了每个小查询,每个小查询都有效并返回一个结果,尽管由于某种原因结果总是空的(这可能取决于或可能不取决于登录的用户,因为一些 PHP 代码生成了这个查询)。

至于结果本身,它们中的大多数看起来像这样(虽然它们是水平排列的):

id(integer)
name (character varying(80))
groupname (character varying(100))
type (unknown)

结果的差异有两个: 1)大多数结果包含相同的字段名称,但其中相当一部分具有不同的字段长度。就像有些人会说字符变化(80),而其他人会说字符变化(100),如果这实际上不是字段长度,请纠正我。2)2个查询包含不同的字段,但只有id字段不同,这可能是因为它们没有“as id”部分。

我不太确定 UNION ALL 的要求是什么,但如果我认为,它意味着只有在所有字段都相同的情况下才有效,但如果那个时髦的数字发生变化(括号中的那个),那么是即使它们具有相同的名称,它们也被认为是不同的字段?

此外,奇怪的是一些查询返回完全相同的字段,具有相同的字段长度,所以我尝试只对这些查询进行 UNION ALL,但没有运气,在 UNION 仍然出现语法错误。

我应该提到的另一个重要的事情是数据库曾经是 MySQL,但我们更改为 PostGreSQL,所以这个错误可能是更改的结果(即可能在 MySQL 中工作但在 PostGres 中不工作的代码)。

谢谢你的时间。

4

3 回答 3

2

您只能有一个“LIMIT xxx”子句。在查询结束时,而不是在 UNION 之前。

于 2011-09-21T17:50:36.577 回答
2

您得到的错误是由于此处缺少括号

...
LIMIT 5
UNION all 
...

手册:

(如果用括号括起来,ORDER BYLIMIT可以附加到子表达式 。如果没有括号,这些子句将应用于 的结果,而不是其右侧输入表达式。)UNION

后面的例子:

于 2011-09-21T17:51:02.307 回答
1

我发现调试大查询的唯一真正方法是将其分解为可理解的部分并独立调试每个子表达式:

  • 每个都显示预期的行吗?
  • 结果字段和类型是否符合预期?
  • 对于union,结果字段和类型是否与对应的其他子表达式完全匹配?
于 2011-09-21T17:08:48.377 回答