Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.01.2011, 19:45   #1
vedro-compota
любитель-далеко не
Участник клуба
 
Аватар для vedro-compota
 
Регистрация: 13.04.2010
Сообщений: 1,156
По умолчанию UPDATE нескольких строк.

Здравствуйте, уважаемые программисты!))

Подскажите как можно переписать такой вот запрос -
Код:
UPDATE STUDENT set  STIPEND = STIPEND *1.2 where STUDENT_ID= 
( SELECT EXAM_MARKS.STUDENT_ID  FROM EXAM_MARKS  GROUP BY EXAM_MARKS.STUDENT_ID HAVING SUM(EXAM_MARKS.MARK)>20) ;
чтобы избавится от ошибки -
Цитата:
#1242 - Subquery returns more than 1 row
итак понятно ,что необходимо изменить несколько строк таблицы....- но mySQL не хочет выполнять команду)
Что необходимо исправить - подскажите пожалуйста)
Заранее благодарю)
против абортов=за + жизнь;.фкн вгу;_______________________мойблг

Последний раз редактировалось vedro-compota; 30.01.2011 в 19:53.
vedro-compota вне форума Ответить с цитированием
Старый 30.01.2011, 21:05   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Например в MS SQL:
Код:
SELECT TOP 1 EXAM_MARKS.STUDENT_ID  FROM
Что-то подобное должно быть и в Мускуле.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 30.01.2011, 21:14   #3
Cronos20
Форумчанин
 
Регистрация: 08.07.2010
Сообщений: 679
По умолчанию

where STUDENT_ID IN (........)

Цитата:
Сообщение от Stilet Посмотреть сообщение
Например в MS SQL:
Код:
SELECT TOP 1 EXAM_MARKS.STUDENT_ID  FROM
Что-то подобное должно быть и в Мускуле.
Тут явно хотят обновить сразу несколько строк, а не одного студента.

Последний раз редактировалось Stilet; 31.01.2011 в 14:29.
Cronos20 вне форума Ответить с цитированием
Старый 30.01.2011, 21:51   #4
ADSoft
Старожил
 
Регистрация: 25.02.2007
Сообщений: 4,160
По умолчанию

лучше опишите какие поля - и что вы хотите сделать? по человечески...а мы запрос построим
ADSoft вне форума Ответить с цитированием
Старый 30.01.2011, 23:15   #5
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию

Код:
UPDATE STUDENT set  STIPEND = STIPEND *1.2 where STUDENT_ID IN(
( SELECT EXAM_MARKS.STUDENT_ID  FROM EXAM_MARKS  GROUP BY EXAM_MARKS.STUDENT_ID HAVING SUM(EXAM_MARKS.MARK)>20));
NiCola999 вне форума Ответить с цитированием
Старый 31.01.2011, 09:07   #6
vedro-compota
любитель-далеко не
Участник клуба
 
Аватар для vedro-compota
 
Регистрация: 13.04.2010
Сообщений: 1,156
По умолчанию

Цитата:
where STUDENT_ID IN (........)
огромное спасибо!)
хочу только спросить - долго ли подобный запрос будет выполнятся на среднестатистическом компьютере если -
мощность EXAM_MARKS где-то 20000 записей , а студентов с SUM(EXAM_MARKS.MARK)>20 на самом деле не существует ?
А то у меня очень долго выполняется) (хотя по-идее таких записей нет)
против абортов=за + жизнь;.фкн вгу;_______________________мойблг
vedro-compota вне форума Ответить с цитированием
Старый 31.01.2011, 09:39   #7
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

правильно сказали про IN
а чтобы точно ответить на последний вопрос нужно полное описание хотя бы этой пары таблиц (чота никак не отражена фильтрация по семестру и т.п.)
а чтобы точно знать есть такие студни или нет - выполни внутренний подзапрос на своих данных
soleil@mmc вне форума Ответить с цитированием
Старый 31.01.2011, 09:45   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
А то у меня очень долго выполняется) (хотя по-идее таких записей нет)
а если только внутренний запрос выполнить
Код:
SELECT EXAM_MARKS.STUDENT_ID  
FROM EXAM_MARKS  
GROUP BY EXAM_MARKS.STUDENT_ID 
HAVING SUM(EXAM_MARKS.MARK)>20
быстро?
а если этот запрос заменить на такой:
Код:
SELECT OTL.STUDENT_ID
FROM (SELECT EXAM_MARKS.STUDENT_ID, SUM(EXAM_MARKS.MARK) as EX_SUM 
FROM EXAM_MARKS
GROUP BY EXAM_MARKS.STUDENT_ID) as OTL
WHERE OTL.EX_SUM >20
проверьте, сколько будет выполняться.

Ну и сделаю крамольное предположение - проверьте, в таблице EXAM_MARKS поле STUDENT_ID является ключевым? Для него есть уникальный индекс?!
Это ОЧЕНЬ важно!

p.s. как вариант можно попробовать добавить индекс по полю MARK - но тут надо быть осторожным - проверить, если на быстродействии положительно не скажется, тогда лучше от этого индекса избавиться...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 31.01.2011, 10:39   #9
vedro-compota
любитель-далеко не
Участник клуба
 
Аватар для vedro-compota
 
Регистрация: 13.04.2010
Сообщений: 1,156
По умолчанию

Цитата:
а если только внутренний запрос выполнить
да) я пробовал подобный запрос, даже более подробный - ищется 0,005 секунды - 1,053
студента с суммой> 20.
(предыдущем посте я немного не то написал - не существует с суммой >50)
----------------------------
Цитата:
SELECT OTL.STUDENT_ID
FROM (SELECT EXAM_MARKS.STUDENT_ID, SUM(EXAM_MARKS.MARK) as EX_SUM
FROM EXAM_MARKS
GROUP BY EXAM_MARKS.STUDENT_ID) as OTL
WHERE OTL.EX_SUM >20
такой запрос тоже быстро за - 0.13 секунды.
-----------------------
Цитата:
в таблице EXAM_MARKS поле STUDENT_ID является ключевым?
да, является - primary key.
----------------------------------------
.....как будто бесконечный цикл.... -

Цитата:
UPDATE STUDENT set STIPEND = STIPEND *1.2 where STUDENT_ID IN ( SELECT EXAM_MARKS.STUDENT_ID FROM EXAM_MARKS
GROUP BY EXAM_MARKS.STUDENT_ID HAVING SUM(EXAM_MARKS.MARK)>50) ;
против абортов=за + жизнь;.фкн вгу;_______________________мойблг

Последний раз редактировалось vedro-compota; 31.01.2011 в 11:00.
vedro-compota вне форума Ответить с цитированием
Старый 31.01.2011, 11:23   #10
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

ну кагбэ приведенное время тоже неизвестно откуда взялось
просто чтобы хотя бы отфетчить все 1053 записи серваку потребуется побольше времени

предлагаю найти границу, на которой вылезает всего до 10 записей через подобный запрос и попробовать прогнать для этих записей апдейтный запрос - оценить время его выполнения, выполнится ли?
soleil@mmc вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
RichView, добавление нескольких пустых строк напарНИК Компоненты Delphi 5 02.02.2011 13:52
Удаление нескольких строк с условием Ppaa Microsoft Office Excel 4 20.12.2010 16:42
выделение нескольких строк цветов в iwdbgrid multidron1 БД в Delphi 0 19.10.2010 12:40
Вычислить длинну текста нескольких строк... Nater Общие вопросы Delphi 3 16.06.2010 15:55
dbGridEh и выбор нескольких строк tavrocotaps Общие вопросы Delphi 3 20.01.2010 23:31