帮助更新SQL

时间:2011-02-10 03:28:21

标签: sql firebird

我有两张桌子(主人,回应)

我需要使用Responses表中的Master_Id字段,在Master表(id)中查找匹配记录,并使用Responses表中的日期字段更新Master表中的日期字段

主表的Id字段链接到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 个答案:

答案 0 :(得分:3)

错误意味着在某些特定主记录有多个响应的情况下,获取日期的子查询返回多行。您可能知道,服务器没有选择正确响应和更新主表的逻辑(日期可能不同或不同,谁知道),因此显示错误消息。

您需要做的是确保子查询只返回一行:在主表上选择响应日期所需的确切行。如果所有响应行包含相同的日期,则可以使用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 :(得分:1)

您可以尝试FIRST

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)