Nano Hash - криптовалюты, майнинг, программирование

У меня большой запрос, как его отладить?

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

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, и, вероятно, это связано с тем, что в них нет части «как id».

Я не совсем уверен в том, каковы требования UNION ALL, но если я думаю, что он должен работать только в том случае, если все поля одинаковы, но если это причудливое число изменится (тот, что в скобках), то поля считаются разными, даже если они имеют одинаковое имя?

Кроме того, странно то, что некоторые запросы возвращали одни и те же поля с одинаковой длиной поля, поэтому я попытался ОБЪЕДИНИТЬ ВСЕ только эти запросы, но безуспешно, все еще получая синтаксическую ошибку в ОБЪЕДИНЕНИИ.

Еще одна важная вещь, которую я должен упомянуть, это то, что БД раньше была MySQL, но мы перешли на PostGreSQL, поэтому эта ошибка может быть результатом изменения (то есть код, который может работать в MySQL, но не в PostGres).

Спасибо за ваше время.


  • то, что вы должны рассмотреть, это просмотр ваших таблиц. Вы заявляете: «Обратите внимание, что table2 и table3 — это одни и те же таблицы в каждом запросе, и поля из table2 и table3, я думаю, также одинаковы». Я думаю, это красный флаг. 21.09.2011
  • В предложении select ключевое слово as называет столбец. В вашем случае вы получите «Потенциальные клиенты» в столбце «Тип» в каждой строке. 21.09.2011
  • @bluefeet Извините, я не очень ясно выразился, когда я сказал, что думаю, что поля одинаковы, я имел в виду, что запросы используют одни и те же таблицы и одни и те же поля для этих таблиц (например, в каждом запросе используется table3.specificid). 21.09.2011

Ответы:


1

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

21.09.2011
  • Большое спасибо, вероятно, это была проблема (запрос работает, если я удалю все лимиты, кроме последнего, теперь мне просто нужно исправить код PHP. Хм. 21.09.2011

  • 2

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

    ...
    LIMIT 5
    UNION all 
    ...
    

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

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

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

    21.09.2011
  • Благодарю вас! Является ли ограничение LIMIT только в Postgresql? 21.09.2011
  • В целом да, но в mysql можно сделать что-то подобное (пример из документы): (SELECT a FROM t1 WHERE a=10 AND B=1 ORDER BY a LIMIT 10) UNION (SELECT a FROM t2 WHERE a=11 AND B=2 ORDER BY a LIMIT 10); 21.09.2011
  • Я вижу, да, это имеет смысл. 21.09.2011
  • Изменить: вы можете сделать точно то же самое в PostgreSQL: (SELECT a FROM t1 WHERE a=10 AND B=1 ORDER BY a LIMIT 10) UNION (SELECT a FROM t2 WHERE a=11 AND B=2 ORDER BY a LIMIT 10); Это даст вам 20 строк. Вы можете добавить еще один LIMIT в конце.. 21.09.2011
  • О, спасибо за это, я как раз собирался пойти и вслепую удалить ограничения, что, скорее всего, было бы нормально, но мне нравится ваш порядок решения. Важное примечание: скобки важны! 21.09.2011

  • 3

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

    • Каждый показывает ожидаемые строки?
    • Соответствуют ли полученные поля и типы ожидаемым?
    • Для union точно ли совпадают поля и типы результатов с соответствующими другими подвыражениями?
    21.09.2011
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..