我有一个大查询,我该如何调试?

时间:2011-09-21 16:50:12

标签: sql postgresql syntax union union-all

所以,我收到此错误消息:

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中的字段也是相同的。

快速提问(我对这一切仍然有点新鲜):
什么'潜在顾客'类型意味着什么?与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中没有)。

感谢您的时间。

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

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

...
LIMIT 5
UNION all 
...

The manual:

  

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

后来的例子:

答案 2 :(得分:1)

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

  • 每个都显示预期的行吗?
  • 结果字段和类型是否符合预期?
  • 对于union,结果字段和类型是否与其他相应的子表达式完全匹配?