2010-08-08 7 views
1

Я пишу вложенный запрос MySQL, в котором подзапрос возвращает более одной строки и, следовательно, запрос не может быть выполнен.Выполнение вложенных запросов MySQL

Может ли кто-нибудь предложить мне решение этой проблемы?

Заранее спасибо.

+5

указать образец кода? –

+7

Проблема в строке 4. Просто измените это, и он будет работать. –

ответ

5

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

WHERE col = (SELECT col2 FROM TABLE_2) 

Решение зависит от данных, поступающих из подзапроса - сделать вас хотите, чтобы запрос использовал все возвращаемые значения? Если да, то изменить знак равенства для IN:

WHERE col IN (SELECT col2 FROM TABLE_2) 

В противном случае, вам нужно исправить подзапрос так это только когда-либо возвращает одно значение. Функции агрегации MAX или MIN являются возможными - они вернут самое высокое или самое низкое значение. Это может быть просто вопрос соотнесения подзапрос:

FROM TABLE_1 t1 
WHERE t1.col = (SELECT MAX(t2.col2) 
          FROM TABLE_2 t2 
         WHERE t2.fk_col = t1.id) -- correlated example 

Как Tabhaza указывает, подзапрос вообще не возвращает более одного столбца (хотя некоторые базы данных поддерживают согласование кортежа), в этом случае вам нужно определить производную таблицу/встроенное представление и присоединиться к ней.

бы хорошо, чтобы получить более подробную информацию по этому вопросу вы имеющие ...

2

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

SELECT a.Field1, a.Field2, b.Field3, b.Field4 
FROM table1 a INNER JOIN 
    (SELECT c.Field3, c.Field4, c.Key FROM table2 as c) as b ON a.Key = b.Key 
WHERE ... 
0

Используйте пункт LIMIT на вложенный запрос, так что всегда возвращает максимум 1 ряд

+4

Это уклоняется от проблемы - если подзапрос должен возвращать значение 1, но возвращает много, суб-запрос написан неправильно. Предложение LIMIT исправляет симптом, но не причину. –

+0

ну, так как ни один код не был отправлен, ответ верен, откуда мы знаем, что он не просто ищет последнюю/самую большую/любую строку в подзапросе, а первая возвращаемая строка всегда правильная? – SpliFF

0

Вы можете добавить LIMIT 1 к подзапроса поэтому верхний запрос учитывает только первый результат. Вы также можете отсортировать результаты из подзапроса перед выполнением LIMIT, чтобы вернуть результат с наивысшим/самым низким значением X. Но убедитесь, что это на самом деле то, что вы хотите, поскольку многозарядный подзапрос часто является симптомом базового проблема.

+1

Это уклоняется от проблемы - если подзапрос должен возвращать значение 1, но возвращает много, суб-запрос написан неправильно. Предложение LIMIT исправляет симптом, но не причину. –

+0

то что делать @jonathan Leffler sir, пожалуйста, предложите свое решение –

+1

@Ankur: покажите нам больше информации - SQL, который не работает, и достаточно схемы (схемы) таблицы, в которой люди имеют что-то продолжать. Смутный вопрос может только получить смутные ответы - к сожалению. –

1

это звучит как логическая проблема, а не проблема синтаксиса.

Почему подзапрос возвращает более одной строки?

Почему у вас это есть в месте, где требуется только одна строка?

Вам необходимо перестроить что-то, чтобы соответствовать этим двум вещам. без каких-либо указаний на вашу систему, ваш запрос или ваше намерение, очень сложно помочь дальше.

+0

+1 - Пятно на ... –

1

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

Это проблема в вашей логике.

Измените запрос так, чтобы он возвращал только одну строку.

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

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