需要 Oracle Update Statement 说明

Oracle Update Statement clarification required

我正在根据另一个 table 的值更新一个 table,使用序列号字段作为查找值的公共字段。但是,从以下 2 个查询中,我得到两个不同的结果。有人可以解释为什么这两个输出不同吗?更新语句不应该更新47200条记录吗?

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 );

结果整数:更新了 35,311 行。

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;

Returns:计数 = 47200

首先,您应该学会使用正确的显式 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 table 中不是唯一的,因此 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 中有一个 unique/primary 键列,那么您可以使用:

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;

其中 ?? 是 unique/primary 键列。