2016-09-18 129 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戈登。我現在明白了。 –