2011-09-21 53 views
0

所以,我得到这个错误信息:我有一个大的查询,我该如何调试?

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

有问题的查询是由与UNION连接在一起的所有12多个较小的查询所有大型查询,并且每个小查询有两个内部联接语句。所以,像这样:

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.... 

注意,表2和表3是每个查询相同的表,并从表2和表3中的字段也一样,我想。

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

我逐个检查了每个小查询,每个查询都工作并返回一个结果,虽然由于某种原因结果总是空的(这可能会也可能不依赖于登录的用户,因为某些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中不起作用的代码)的结果。

谢谢你的时间。

+0

你应该考虑的是审查你的表格。你说'请注意,table2和table3是每个查询中的相同表,而且我认为table2和table3中的字段也是相同的。我认为,是一面红旗。 – Taryn

+0

在'select'子句中,'as'关键字命名一列。在你的情况下,你会在每行的Type列中得到'Leads'。 –

+0

@bluefeet对不起,我不是很清楚,当我说我认为字段相同时,我的意思是查询对这些表使用相同的表和相同的字段(例如,每个查询使用table3.specificid)。 – zermy

回答

1

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

+0

非常感谢,这可能是问题(如果我删除除最后一个之外的所有限制,现在我只需要修复PHP代码,查询就可以工作。嗯。 – zermy

1

我发现调试大查询的唯一途径是将其分解成可以理解的零件和调试的每个子表达式独立:

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

感谢您的建议,我会尽量记住它。 – zermy

2

你得到的错误是最有可能是由于这样的:

LIMIT 5 
UNION all 

LIMIT只能在最后一个SELECT后出现UNION后,即。看看docs

+0

谢谢! 仅在Postgresql中有LIMIT限制吗? – zermy

+1

通常是的,但在MySQL中你可以做这样的事情(例如[docs](http://dev.mysql.com/doc/refman/5.6/en/union.html)): '(SELECT a FROM t1 where WHERE a = 10 and B = 1 ORDER BY a 10) UNION (SELECT a FROM t2 WHERE a = 11 AND B = 2 ORDER BY a LIMIT 10);' –

+0

我明白了,是的,这是有道理的。 – zermy