1

次の更新ステートメントは、更新ステートメントで内部結合を使用する最初の試みです。構文が間違っていますが、どこにあるのかわかりませんが、コマンドが正しく終了されていないというエラーが発生し続けます。誰でもこれを手伝ってもらえますか。

UPDATE m_rqgrechunk a
SET    a.persondept = b.persondept
FROM   m_rqgrechunk a
       INNER JOIN m_person_persondept_hist b
         ON a.person = b.person
WHERE  ( ( b.from_date IS NULL
           AND b.to_date IS NULL )
          OR ( b.from_date IS NULL
               AND a.create_date < b.to_date )
          OR ( a.create_date >= b.from_date
               AND a.create_date < b.to_date )
          OR ( a.create_date >= b.from_date
               AND a.to_date IS NULL ) )
       AND a.persondept IS NULL 
4

2 に答える 2

1

これは、Oracle で行う方法です。

UPDATE m_rqgrechunk a
SET    a.persondept = 
       ( SELECT b.persondept
         FROM m_person_persondept_hist b
         WHERE a.person = b.person
           AND ( ( b.from_date IS NULL
                   AND b.to_date IS NULL )
              OR ( b.from_date IS NULL
                   AND a.create_date < b.to_date )
              OR ( a.create_date >= b.from_date
                   AND a.create_date < b.to_date )
              OR ( a.create_date >= b.from_date
                   AND a.to_date IS NULL ) )
       )
WHERE a.persondept IS NULL 
  AND EXISTS 
       ( SELECT 1  
         FROM m_person_persondept_hist b 
         WHERE a.person = b.person  
           AND ( ( b.from_date IS NULL 
                   AND b.to_date IS NULL ) 
              OR ( b.from_date IS NULL  
                   AND a.create_date < b.to_date ) 
              OR ( a.create_date >= b.from_date 
                   AND a.create_date < b.to_date )
              OR ( a.create_date >= b.from_date
                   AND a.to_date IS NULL ) )
       ) ;

この場合、このNOT EXISTS部分は実際には必要ありません。理由もなく肥大化するログスペースを除いて、更新される値は無効に更新NULLしても(あまり)害がないからです。NULL


もう 1 つの方法は、派生テーブルを使用することです。

UPDATE 
( SELECT a.persondept, b.persondept AS persondept_new
  FROM m_rqgrechunk a
    JOIN m_person_persondept_hist b
      ON a.person = b.person
  WHERE ( ( b.from_date IS NULL
            AND b.to_date IS NULL )
       OR ( b.from_date IS NULL
            AND a.create_date < b.to_date )
       OR ( a.create_date >= b.from_date
            AND a.create_date < b.to_date )
       OR ( a.create_date >= b.from_date
            AND a.to_date IS NULL ) )
    AND a.persondept IS NULL
) 
SET persondept = persondept_new ;
于 2013-07-02T20:53:30.930 に答える
0

結合による更新は、私見がこのように行われます

UPDATE m_rqgrechunk a
   INNER JOIN m_person_persondept_hist b
     ON a.person = b.person
SET    a.persondept = b.persondept
WHERE  ( ( b.from_date IS NULL
       AND b.to_date IS NULL )
      OR ( b.from_date IS NULL
           AND a.create_date < b.to_date )
      OR ( a.create_date >= b.from_date
           AND a.create_date < b.to_date )
      OR ( a.create_date >= b.from_date
           AND a.to_date IS NULL ) )
   AND a.persondept IS NULL 
于 2013-07-02T20:50:09.277 に答える