需要 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_NUMBER
在 B
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 键列。
我正在根据另一个 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_NUMBER
在 B
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 键列。