2014-02-20 3 views
0

Может кто-нибудь, пожалуйста, помогите мне с этим «простым» запросом.SQL: UPDATE количество строк с использованием другой таблицы

У меня есть две таблицы: Tunes и SavedRatings

Tunes содержит груз мелодии информации, включая (INTEGER) поле Оценка и поле MD5 используется, чтобы однозначно идентифицировать мелодию.

SavedRatings - это таблица, состоящая из поля рейтинга и MD5, поэтому, когда я удаляю содержимое Tunes и добавляю мелодии позже, я могу определить рейтинг, присвоенный этой мелодии.

Итак, я пытаюсь обновить поле «Рейтинг» в моей таблице «Tunes», сопоставив поле Tunes MD5 в таблице SavedRatings.

Я пришел с приведенной ниже командой, которая совершенно неверна. Можете ли вы предложить альтернативу? Я использую SQLite.

UPDATE Tunes 
SET Tunes.Rating=SavedRatings.Rating 
WHERE Tunes.MD5 IN (SELECT MD5 FROM SavedRatings); 
+0

Интересно, зачем использовать эту информацию в двух таблицах, если вы хотите сохранить ее синхронно :-) – Smutje

+0

@Smutje: Потому что я хочу регулярно очищать таблицу Tunes. Когда я загружаю мелодии, которые были оценены раньше, я хочу, чтобы эти мелодии получили рейтинг. Содержимое таблицы SavedRatings будет «вечно». Содержимое таблицы Tunes не будет. – SparkyNZ

ответ

1

Попробуй

update Tunes set Rating = (select SavedRating.Rating from SavedRating where Tunes.md5 = SavedRating.md5)

Надеюсь, что это поможет!

+0

@ user1101733: Это делает работу, спасибо. Я не уверен, что условие WHERE EXISTS могло бы быть честным. Разве он не остановил бы null от назначения, если инструкция SELECT не вернула строки? – SparkyNZ

+0

Нет, это сработает, даже инструкция SELECT вернется к новам. Он будет обновляться только тогда, когда Tunes.md5 = SavedRating.md5 является истинным, иначе ничего не делать – user1101733

2
UPDATE T 
SET T.Rating = S.Rating 
FROM Tunes T INNER JOIN SavedRatings S 
ON T.MD5 = S.MD5 
+0

Спасибо за это. Я дам вам попробовать и принять ваш ответ, если он выполнит эту работу .. и я уверен, что это будет :-) – SparkyNZ

+0

Я пробовал это с помощью менеджера SQLite (плагин Firefox), и это дало мне синтаксическую ошибку, которая была не очень информативный. Я уверен, что в MySQL все будет хорошо. – SparkyNZ

+0

Нет, это синтаксис SQL-сервера. Синтаксис mysql немного отличается. –

1

Вы можете сделать что-то вроде

UPDATE Tunes 
SET Tunes.Rating = SavedRatings.Rating 
FROM SavedRatings 
WHERE Tunes.MD5 = SavedRatings.MD5; 
+0

Спасибо, я попробовал это с помощью менеджера SQLite (плагин Firefox), и это дало мне синтаксическую ошибку, которая была не очень информативной. Та же проблема с другим предложением. Я не думаю, что SQLite почему-то любит пунктирную нотацию ?? – SparkyNZ

0

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

UPDATE Tunes 
SET Rating = (SELECT Rating FROM SavedRatings WHERE MD5=Tunes.MD5 LIMIT 1) 
WHERE EXISTS (SELECT Rating FROM SavedRatings WHERE MD5=Tunes.MD5 LIMIT 1); 
Смежные вопросы