2013-04-16 2 views
0

Я пытаюсь запустить этот запрос в MySQLВы не можете указать целевую таблицу «» для обновления в ЕКЕ

UPDATE studentassessment sa SET sa.issubmitted=FALSE WHERE 
sa.studentassessmentid <> 
    (SELECT studentassessmentid FROM studentassessment sa1 WHERE 
    sa.StudentId=sa1.StudentId 
    AND sa.AssessmentPeriodId=sa1.AssessmentPeriodId 
    ORDER BY sa1.studentassessmentid DESC LIMIT 0, 1) 
AND sa.studentid=568; 

, который дает мне эту ошибку

Вы не можете указать цель table 'sa' для обновления в FROM FROM

Я нашел номер этого типа вопросов, но они относятся к запросам, для которых они были заданы, поэтому мне не очень помогли, из одного из ответов SO Это Ried изменить запрос, как этот

UPDATE studentassessment sa SET issubmitted=FALSE WHERE 
sa.studentassessmentid <> 
    (
     SELECT studentassessmentid FROM 
     (
      SELECT studentassessmentid FROM studentassessment sa1 WHERE 
       sa.StudentId=sa1.StudentId 
      AND sa.AssessmentPeriodId=sa1.AssessmentPeriodId 
      ORDER BY sa1.studentassessmentid DESC LIMIT 0, 1 
     ) AS T 
    ) 
AND sa.studentid=568; 

Тогда я начал получать эту ошибку

Неизвестный столбец 'sa.StudentId' в 'где п'

Любая помощь?

Редактировать

Это также не работает

UPDATE studentassessment sa 
INNER JOIN 
(SELECT studentassessmentid FROM studentassessment sa1 WHERE 
    sa.StudentId=sa1.StudentId 
    AND sa.AssessmentPeriodId=sa1.AssessmentPeriodId 
    ORDER BY sa1.studentassessmentid DESC LIMIT 0, 1) T 
ON sa.studentassessmentid<>T.StudentAssessmentId 
SET sa.issubmitted=0 
WHERE sa.studentid=568; 

ответ

1

MySQL has that limitation; вы не можете обновить таблицу, которую вы выбираете, и вы ничего не делаете.

В настоящее время вы не можете обновить таблицу и выбрать из той же таблицы в подзапросе.

Однако вы можете сделать это:

CREATE TEMPORARY TABLE studentassessmentids (
    `id` INT, 
    PRIMARY KEY (`id`) 
); 

LOCK TABLE studentassessment WRITE; 
INSERT INTO studentassessmentids (SELECT ... prepare your ids); 

UPDATE studentassessment sa 
SET sa.issubmitted=FALSE 
WHERE sa.studentassessmentid NOT IN (
    SELECT id 
    FROM studentassessmentids AS ids 
    WHERE ids.id = sa.studentassessmentid 
) 

UNLOCK TABLES; 
DROP TEMPORARY TABLE studentassessmentids; 

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

И если вы могли бы переписать запрос группы из JOIN заявлений, как (например, из mysql.com):

UPDATE items,month SET items.price=month.price 
WHERE items.id=month.id; 

Он должен работать, но я не вижу, как можно реализовать NOT IN с соединениями без написания мало читаемого кода.

+0

Спасибо! Фактически временная концепция таблицы была в моем сознании, но я должен передать запрос кому-то, чтобы запустить, поэтому я думал, могу ли я сделать это в одном самом запросе. Значит, нет никакой возможности, кроме временной таблицы? –

+0

@PawanNogariya вы можете сделать это также с помощью объединений, но я не вижу, как вы можете это сделать в этом конкретном случае. В любом случае, он добавил, чтобы ответить. – Vyktor

+0

Извините, я не вижу участия в вашем ответе, хотя я тоже пробовал с присоединением, что не работал, я добавил его к моему вопросу –

0

нашел ответ

UPDATE studentassessment dest, 
    (
     SELECT studentassessmentid,assessmentperiodid 
     FROM studentassessment sa WHERE sa.studentid=568 
     AND sa.studentassessmentid<> 
      (
       SELECT studentassessmentid FROM studentassessment s 
       WHERE s.studentid=568 
       AND sa.assessmentperiodid=s.assessmentperiodid 
       ORDER BY studentassessmentid DESC LIMIT 1 
      ) 

    )src 

    SET dest.issubmitted=FALSE 
    WHERE dest.studentassessmentid=src.studentassessmentid 
Смежные вопросы