2013-04-08 2 views
0

У меня есть следующая таблица называется «РЕЗУЛЬТАТ», что я получаю значение из другой таблицы под названием «Temp_main»Использование условного Update - На дубликате ключа обновления

пол в «Result», как следующее:

StudentName | SujectName | Result 
--------------------------------- 
Adam  | Math  | Fail 
Bob   | History | Pass 
Catherine | Math  | Pass 
Dave  | Science | Fail 
Evan  | History | Pass 

Первичный ключ здесь (StudentName,SubjectName)

Я использую следующий код, чтобы получить данные в таблицу:

insert into result(studentName,subjectName,result) 
select StudentName,SubjectName,result 
from temp_main 

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

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

Я пытаюсь получить ON DUPLICATE KEY UPDATE код, который обновляет результат студента-субъектных пары тогда и только тогда, когда последний результат «Pass»

Я попытался

insert into result(studentName,subjectName,result) 
    select StudentName,SubjectName,result 
    from temp_main 
on duplicate key update result = case when temp_main(result) = 'Pass' 
Then result(result)='Pass' 

Я уверен, это дрянной код. Но я не мог найти лучшего решения.

+0

'последний результат? Есть ли столбец 'resultDate' столбца temp_main, о котором вы нам не говорите? –

+0

Нет. Я имел в виду результат в столбце temp_main. Извините за путаницу. –

+0

@KumaranSenapathy - То, что Том имеет в виду, заключается в том, что SQL действительно не поддерживает вещи в «порядке». ** ТОЛЬКО ** для обеспечения конкретной «последней» (или любой другой) строки использовать предложение «ORDER BY» с соответствующим столбцом. Если у вас нет такого столбца, вы в основном тосты, потому что все строки одинаково упорядочены. –

ответ

1

Вы пропускаете END от вас SQL

INSERT INTO result(studentName,subjectName,result) 
SELECT StudentName,SubjectName,result 
FROM temp_main 
ON DUPLICATE KEY UPDATE result.result = CASE WHEN result.result = 'Pass' THEN 'Pass' ELSE VALUES(result.result) END 
+0

Я не получаю никаких ошибок, но обновление не произошло. Он по-прежнему отражает «Fail». –

+0

Я поставил свои столы на свою машину и сыграл в игру. Существует одна проблема, по которой MySQL, похоже, запутывается, имея столбец с именем result как в таблице, в которую вы вставляете, так и в исходную таблицу, и вы не можете применить псевдоним к имени таблицы, в которое вы вставляете. В качестве исправления, чтобы доказать, что это сработало, я изменил имя столбца результата на temp_main, и он работал нормально. – Kickstart

+0

Я использовал имена таблиц до «результатов». См. Править. Это все еще не помогло –