Почему MySql выдает ошибку «Подзапрос возвращает более 1 строки»? - PullRequest
0 голосов
/ 14 мая 2009

Привет, парень, я выбираю свою активную запись из моих таблиц, и все остальные мои записи в порядке, но активная запись выдает мне ошибки, мой код

@ query = Estate.find_by_sql "ВЫБЕРИТЕ (e.name) как estate_name, g.name как управляющее_body," + "(выберите количество () из стендов s, где s.estate_id = e.id AND # {filter_estates}) как total_stands," + "(выберите e.active из состояний e, где e.active = true AND # {filter_estates}) как estate_status," + "(выберите количество () из служб sp, где sp.estate_id = e.id AND # {filter_estates}) в качестве service_providers," + "(выберите количество (*) из утвержденных_вендоров av, где av.estate_id = e.id AND # {filter_estates}) в качестве поставщиков" + "ИЗ СВОЕЙ ЭЛЕМЕНТОВ ЛЕВОГО СОЕДИНЕНИЯ с guling_body_id = g.id И ## filter_estates}"

и я получаю ошибку.

(Mysql :: Ошибка: подзапрос возвращает более 1 строки: SELECT (e.name) как estate_name, g.name как gouling_body, (выберите количество () из стендов s, где s.estate_id = e.id AND e.id NOT NULL) как total_stands (выберите e.active из состояний e, где e.active = true, а e.id NOT NULL) как estate_status (выберите количество () из служб sp, где sp. estate_id = e.id И e.id НЕ НЕДЕЙСТВИТЕЛЕН) в качестве service_providers, (выберите count (*) из утвержденных_вендоров av, где av.estate_id = e.id И e.id НЕ НЕДЕЙСТВУЕТ) как продавцы ИЗ поместий e СЛЕДУЮЩЕЕ СОЕДИНЕНИЕ на e.gouling_body_id = g.id И e.id НЕДЕЙСТВИТЕЛЕН):

и я хочу отобразить все поместья, которые являются активными и неактивными.

пожалуйста, ребята, как я могу решить эту проблему. я использую базу данных Mysql.

Ответы [ 4 ]

3 голосов
/ 14 мая 2009

Похоже, у вас могут быть проблемы с вашей третьей строкой:

(выберите e.active из состояний e, где e.active = true AND # {filter_estates}) как estate_status

В строках выше и ниже, которые используют агрегат, поэтому они возвращают только одну строку, это может (вероятно,) вернуть несколько строк, и он не знает, какую из них присвоить estate_status.

Возможно, вы могли бы просто изменить эту строку на:

e.active as estate_status

1 голос
/ 14 мая 2009

Я, конечно, не знаком с таблицей, поэтому лучший ответ, который я могу дать вам сейчас, - почему этот запрос не работает.

выберите e.active из состояний e, где e.active = true AND # {filter_estates}) как estate_status

эта строка возвращает более одной строки, что вы не можете сделать там. Заметьте, что ваши другие используют функции aggegrate, поэтому они возвращают только одну строку.

О, я не очень часто использую My SQL, но в T-SQL мы часто делаем такие вещи, как max (e.active) или, возможно, ставим топ-1 (который я считаю Limit 1 в моем sQL)

0 голосов
/ 11 сентября 2009

Подзапрос в предложении SELECT должен возвращать только 1 строку и 1 столбец, чтобы быть однозначным. Этот кусок производит более 1 строки:

"(select e.active from estates e where e.active = true AND #{filter_estates}) as estate_status

изменить на

"(select first(e.active) from estates e where e.active = true AND #{filter_estates}) as estate_status
0 голосов
/ 14 мая 2009

Ваш подзапрос

(SELECT e.active FROM estates e WHERE   ...) AS estate_status  

возвращает более одного значения.

Если вы можете, используйте «TOP 1», как:

SELECT e.name AS estate_name   ,
       g.name AS governing_body,
       (SELECT COUNT(*) FROM stands s            WHERE   ...) AS total_stands,
       (SELECT TOP 1 e.active FROM estates e     WHERE   ...) AS estate_status,
       (SELECT COUNT(*) FROM services sp         WHERE   ...) AS service_providers,
       (SELECT COUNT(*) FROM approved_vendors av WHERE   ...) AS vendors
FROM   estates e
LEFT 
JOIN   governing_bodies g ON  e.governing_body_id = g.id
                          AND ...
...