У меня большой запрос, как мне это отладить? - PullRequest
0 голосов
/ 21 сентября 2011

Итак, я получаю это сообщение об ошибке:

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 в ('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 ]

2 голосов
/ 21 сентября 2011

Вы можете иметь только одно предложение «LIMIT xxx». В конце запроса, а не перед UNION.

2 голосов
/ 21 сентября 2011

Ошибка, которую вы получаете из-за отсутствующих скобок здесь:

...
LIMIT 5
UNION all 
...

Руководство:

(ORDER BY и LIMIT могут быть присоединены к подвыражению, если оно заключено в круглые скобки . Без скобок эти пункты будут применяться для применения к результату UNION, а не к его правому вводувыражение.)

Более поздний пример:

1 голос
/ 21 сентября 2011

Единственный реальный способ отладки больших запросов, который я нашел, - разбить его на понятные части и отладить каждое подвыражение независимо:

  • Отображает ли каждая ожидаемые строки?результирующие поля и типы, как и ожидалось?
  • Для union, совпадают ли результирующие поля и типы с соответствующими другими подвыражениями?
...