一个非常基本的问题,我有一个更新,我想做更新,然后它影响2000多行,但当我只是在子查询中执行选择查询,然后我得到1726行。我知道我的更新声明中有问题,有人可以帮忙吗?
update ship_plu
set pluc_dt='1-Jan-1999'
where pluc_dt in (
select sp.pluc_dt
from ship_plu sp,ship s
where sp.pluc_dt between '16-Feb-2014' and '20-Feb-2014'
and sp.ship_num=s.ship_num
and s.rcv_dt is null
)
因此,在执行的子查询上面只返回1726行,但是当我执行整个更新查询时,它会影响超过2000行,我想只做1726行?
答案 0 :(得分:2)
您需要相关子查询。但是你有内部子查询引用外部表。试试这个:
update ship_plu sp
set pluc_dt='1-Jan-1999'
where pluc_dt in (
select sp.pluc_dt
from ship s
where sp.pluc_dt between '16-Feb-2014' and '20-Feb-2014'
and sp.ship_num=s.ship_num
and s.rcv_dt is null
);
此查询形式适用于任何数据库。根据您使用的实际数据库,您可以使用其他语法(使用join
)。
答案 1 :(得分:1)
因为您要更新行,所以不应更新。
ship_plu.pluc_dt
可能符合条件,而ship_plu.ship_num
不。
这是更新的错误方法。
你应该试试:
update ship_plu sp JOIN ship s ON sp.ship_num=s.ship_num set pluc_dt='1-Jan-1999' where pluc_dt between '16-Feb-2014' and '20-Feb-2014' and s.rcv_dt is null;
另一个选择(假设ship_num
是唯一的,而某个外键是):
update ship_plu set pluc_dt='1-Jan-1999' where ship_num in ( select sp.ship_num from ship_plu sp,ship s where sp.pluc_dt between '16-Feb-2014' and '20-Feb-2014' and sp.ship_num=s.ship_num and s.rcv_dt is null );
我个人认为,第一个更好。
答案 2 :(得分:0)
我检查了你的查询,也许这可以提供帮助:
select sp.pluc_dt
from ship_plu sp,ship s
where sp.pluc_dt between '16-Feb-2014' and '20-Feb-2014'
and sp.ship_num=s.ship_num
and s.rcv_dt is null
此子查询中的ship_plu表正在连接表船。如果ship表中没有关系结果(条件s.rcv_dt必须满足null),则不返回ship_plu表中的值。
这意味着更新命令更新也记录,它们具有相同的值pluc_dt,但它在ship表中的关系不满足条件s.rcv_dt为null。
我建议从查询中返回记录标识符。改变你这样查询:
update ship_plu
set pluc_dt='1-Jan-1999'
where ID in (
select sp.ID
from ship_plu sp,ship s
where sp.pluc_dt between '16-Feb-2014' and '20-Feb-2014'
and sp.ship_num=s.ship_num and s.rcv_dt is null
)
希望它有所帮助!
马立克