使用返回多行的子查询进行更新

时间:2014-08-07 10:41:59

标签: sql sas

需要帮助。这个问题让我大吃一惊。

我的问题几乎与问题Lookup values in one table and add to dataset according to IF condition (MERGE/SQL)?

中的问题相同

我正在使用答案中的一个代码:

proc sql;
update master as a
    set loadport=(select loadport from lookup as b
    where a.LoadCountry=b.LoadCountry and a.LoadArea=b.LoadArea)
where lportmiss=1;
quit;

但是我遇到了错误"子查询被评估为多行"。据我所知,这意味着在查找数据集中有多个具有相同装载端口名称的装载端口,并且sql不知道选择哪个装载端口。
我的问题是应该在查找数据集中选择第一个满足装载端口进行哪些改进? 谢谢!

1 个答案:

答案 0 :(得分:2)

这样的东西会起作用。您需要使用摘要功能减少到一行。如果您确信一个loadCountry / loadArea组合将始终只有一个端口,这是安全的;如果您不这样做,那么您需要考虑如何正确执行此操作(maxmin是否正常,或者如果您需要标记错误或其他内容(如果发生这种情况)) 。几乎任何摘要功能都可以在这里完成。

proc sql;
update master as a
    set loadport=(select max(loadport) from lookup as b
    where a.LoadCountry=b.LoadCountry and a.LoadArea=b.LoadArea
    group by b.loadCountry,b.loadArea)
where lportmiss=1;
quit;