为什么在我的更新sql查询中会影响不同的值?

时间:2014-02-20 16:26:55

标签: sql select subquery

一个非常基本的问题,我有一个更新,我想做更新,然后它影响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行?

3 个答案:

答案 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
        )

希望它有所帮助!

马立克