Помогите с обновлением SQL - PullRequest
       5

Помогите с обновлением SQL

0 голосов
/ 10 февраля 2011

У меня есть две таблицы (мастер, ответы)

Мне нужно использовать поле Master_Id из таблицы "Ответы", чтобы найти его в главной таблице (id) для сопоставления записи и обновить поле даты в основной таблице с полем даты в таблице "Ответы"

Поле Id Master Table ссылается на поле Reponses таблицы Master_id

Можно ли это сделать в SQL ????

UPDATE Master m SET m.date = (
     SELECT r.date FROM Reponses r WHERE r.master_id = m.id)  
WHERE m.id IN (SELECT master_id FROM Responses) 

Я получаю - Общая ошибка SQL - Несколько строк в одиночном выборе.

Нужно ли добавить соединение или что-то изменить?

Ответы [ 2 ]

3 голосов
/ 10 февраля 2011

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

Что нужно сделать, это убедиться, что подзапрос возвращает только одну строку: точную одну строку, необходимую для выбора даты ответа в основной таблице. Если все строки ответа содержат одну и ту же дату, вы можете использовать предложение FIRST, чтобы вернуть только первую строку, как предложено @ cyberkiwi.

Но вы можете выбрать самые новые, самые старые или любые другие на основе критериев:

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

UPDATE Master m SET m.date = (
     SELECT FIRST 1 r.date FROM Reponses r WHERE r.master_id = m.id)  
WHERE m.id IN (SELECT master_id FROM Responses) 

UPDATE Master m SET m.date = (
     SELECT MAX(r.date) FROM Reponses r WHERE r.master_id = m.id)  
WHERE m.id IN (SELECT master_id FROM Responses) 

UPDATE Master m SET m.date = (
     SELECT MIN(r.date) FROM Reponses r WHERE r.master_id = m.id)  
WHERE m.id IN (SELECT master_id FROM Responses) 

UPDATE Master m SET m.date = (
     SELECT r.date FROM Reponses r WHERE r.master_id = m.id AND r.accepted = 1)  
WHERE m.id IN (SELECT master_id FROM Responses) 
1 голос
/ 10 февраля 2011

Вы можете попробовать ПЕРВЫЙ

UPDATE Master m SET m.date = (
     SELECT FIRST 1 r.date FROM Responses r WHERE r.master_id = m.id)  
WHERE m.id IN (SELECT master_id FROM Responses) 
...