2016-09-18 29 views
0

値を検索するための共通フィールドとしてシリアル番号フィールドを使用して、別のテーブルの値に基づいてテーブルを更新しています。しかし、2つのクエリから私は2つの異なる結果を得る。なぜ2つの出力が異なるのかを説明できるのでしょうか?更新文は47200レコードを更新するべきではありませんか?Oracle Update Statementの明確化が必要

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:35,311 rows updated。

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構文を使用することを学ぶ必要があります。したがって、2番目のクエリは次のようになります。

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; 

2つのクエリが同じではないため、結果が表示されます。あなたの結果はBテーブルでSERIAL_NUMBERが一意ではないことを示しているので、JOINは行を掛けています。一方、は、Bの一致数にかかわらず、Aの行を更新しています。

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ゴードン。私は今、写真を手に入れます。 –

関連する問題