2011-09-21 57 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