2016-12-01 3 views
3

Почти все встретился этот подзапрос ОШИБКА:почему не MySQL поддержки 'LIMIT & IN/ALL/ANY/SOME подзапроса'

This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery 

и каждый ответ предложить нам заменить подзапрос с left outer join в этой ситуации.

Поддерживающий личный подзапрос с действующим приложением является приятным для использования, потому что множество подзапросов используется с оператором in, но почему группа разработчиков MySQL решила не доводить ее до MySQL, есть ли какие-либо причины, ограничивающие их оператор в подзапросе опасная или плохая производительность?

30 ноября 2016 года, как последняя бета-версия Mysql 8.0, MySQL все еще не поддерживает такой подзапрос.

http://dev.mysql.com/doc/refman/8.0/en/subquery-errors.html

+0

Потому что они могут быть переписаны с помощью объединений, и это меньше, чем вы пытаетесь угодить своему списку. – Drew

+0

@Drew Я думал, что коррелированный подзапрос в предложении 'IN' с' LIMIT' может быть действительно уродливым с точки зрения производительности. Поскольку использование объединений было бы просто лучше, возможно, именно поэтому люди в MySQL не реализовали его, чтобы не создавать плохие привычки базы данных. –

+0

Я бы так никогда не закодировал. Это была моя первая мысль. Наказание. – Drew

ответ

1

Поработав с SQL (в основном Oracle й SQL Server) в течение около 14 лет (в основном в высоких сложных условиях для крупнейших компаний в мире); Я настоятельно рекомендую вам просмотреть свой способ работы - никогда не было необходимости ограничивать результаты подзапроса таким образом.

Вот мои комментарии по каждому сценарию, указанному в этой ссылке, которую вы послали:

  1. Используя «предел» в подзапрос: это сделало бы лежа результаты
  2. Несколько столбцов в подзапроса внутри SELECT, Я понимаю несколько случаев, когда это было бы полезно, но было бы странно читать инструкцию SQL, поэтому я думаю, что она не поддерживается - я не знаю ни одного движка db, который бы разрешил это, и существует несколько способов чтобы сделать это правильно.
  3. Подзапрос возвращает более одной строки - да, если вы хотите значение EQUAL, оно должно быть равно другому значению, а не списку; если вам нужно какое-либо значение из списка, тогда это другая вещь, поэтому требуется другой синтаксис.
  4. Обновление той же таблицы, что и в подзапросе, - техническое ограничение, некоторые механизмы блокируют таблицы вместо строк. Я уверен, что я сделал это много; gotta love Oracle DB :-)

    Единственный возможный сценарий, который я мог бы придумать, чтобы ограничить результаты подзапроса, - это привести только образец данных, например, если вы хотите принести количество ошибок в журнал или что-то, и вам просто нужен столбец для случайной выборки (например: [ПРОГРАММА] [РЕЖИМ ЗАДАНИЯ] [ERR COUNT] [ERR EXAMPLE]) ... в этом очень редком случае я бы понял использование ограничения результата подзапроса но для этого вы можете использовать любую группу по таким функциям, как MIN() или MAX().

    В любом случае, если вы найдете какой-либо сценарий, который, по вашему мнению, вам нужен, чтобы ограничить результаты подзапроса, и это не просто привести образец данных - подумайте еще раз, что-то, вероятно, не так с вашей логикой; спросите здесь, если это так :-)

Смежные вопросы