【问题标题】:Inner Join Update Statement command not properly ended内部联接更新语句命令未正确结束
【发布时间】:2013-07-03 05:09:19
【问题描述】:

以下更新语句是我第一次尝试在更新语句上使用内连接。我的语法错误,但我不确定在哪里,但我不断收到命令未正确结束的错误。任何人都可以帮助解决这个问题。

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 

【问题讨论】:

  • 基于“命令未正确结束”我假设是 Oracle。
  • @Ryan - 这在 TSQL 的专有 UPDATE ... FROM 语法中有效。但根据错误消息,他们似乎没有使用 SQL Server。

标签: sql oracle


【解决方案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 无效地更新它们并没有什么坏处,除了日志空间变得臃肿无缘无故。


另一种方法是使用派生表:

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 ;

【讨论】:

    【解决方案2】:

    恕我直言,加入更新是这样完成的

    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 
    

    【讨论】:

      猜你喜欢
      • 2016-02-04
      • 1970-01-01
      • 2014-09-27
      • 2012-05-29
      • 2016-10-15
      • 1970-01-01
      • 1970-01-01
      • 2021-06-01
      • 1970-01-01
      相关资源
      最近更新 更多