2016-09-18 86 views
0

我正在使用序列号字段作为查找值的公用字段,根据另一个表中的值更新表。然而,从2个以下的查询中我得到两个不同的结果有人可以解释为什么两个产出不同吗?更新语句不应该更新47200记录?需要更新Oracle声明

UPDATE TBL_SERIAL_NUMBER_MASTER A 
SET (A.name) = (SELECT B.name 
       FROM TBL_DEVICE_LOCALITY B 
       WHERE A.SERIAL_NUMBER = B.SERIAL_NUMBER AND ROWNUM <=1) 
WHERE EXISTS (SELECT 1 
       FROM TBL_DEVICE_LOCALITY 
       WHERE SERIAL_NUMBER = A.SERIAL_NUMBER 
       AND TBL_ODIN_DEVICE_LOCALITY.HOST_NAME IS NOT NULL); 

结果int:更新了35311行。

select count(*) 
from TBL_SERIAL_NUMBER_MASTER A, TBL_DEVICE_LOCALITY B 
WHERE A.SERIAL_NUMBER = B.SERIAL_NUMBER AND B.HOST_NAME IS NOT NULL; 

返回:数= 47200

+0

您的第一个查询引用子查询中的表TBL_ODIN_DEVICE_LOCALITY。我认为这是一个错字。 –

+0

是的,这是一个错字 –

回答

1

首先,你应该学会使用正确的明确JOIN语法。所以,第二个查询应该是:

select count(*) 
from TBL_SERIAL_NUMBER_MASTER A JOIN 
    TBL_DEVICE_LOCALITY B 
    ON A.SERIAL_NUMBER = B.SERIAL_NUMBER 
where B.HOST_NAME IS NOT NULL; 

你得到你看到的,因为这两个查询是不一样的结果。你的结果表明SERIAL_NUMBERB表中不是唯一的,所以JOIN是乘以行。另一方面,UPDATE正在更新A中的行,而不管B中的匹配数量是多少。

比较喜欢就好,使用:

select count(*) 
from TBL_SERIAL_NUMBER_MASTER A JOIN 
    TBL_DEVICE_LOCALITY B 
    ON A.SERIAL_NUMBER = B.SERIAL_NUMBER 
where exists (select 1 
       from TBL_DEVICE_LOCALITY B 
       where B.SERIAL_NUMBER = A.SERIAL_NUMBER AND 
        B.HOST_NAME IS NOT NULL 
      ); 

或者,如果你有A独特的/主键列,那么你可以使用:

select count(distinct A.??) 
from TBL_SERIAL_NUMBER_MASTER A JOIN 
    TBL_DEVICE_LOCALITY B 
    ON A.SERIAL_NUMBER = B.SERIAL_NUMBER 
where B.HOST_NAME IS NOT NULL; 

哪里??是唯一/主键列。

+0

thx戈登。我现在明白了。 –