2013-03-27 28 views
0

我原来的更新语句在Sybase中仍然很好(见下文),但我们正在迁移到Oracle 11g,我必须将此更新语句转换为Oracle Update。 我尝试了很多版本并不断收到错误,我想我没有弄明白Oracle Update语句是如何工作的。谁能帮忙?什么是Oracle 11g中的正确更新声明

我原来的好更新语句(在Sybase):

UPDATE Valid 
    SET A.status = 'X', 
     A.reason = 'Missing' 
    FROM Valid A, Valid B 
    WHERE A.id_number = B.id_number 
    AND A.session_id = 69 
    AND A.userid = 'BS' 
    AND A.status = 'A' 
    AND isnull(B.street1, ' ') = ' ' 

下面是我的Oracle版本无法正常工作,无论我做了什么:

MERGE 
    INTO um_valid Target 
    USING (select * from um_valid) SOURCE 
    ON (t1.id_number = t2.id_number)     
    WHEN MATCHED THEN 
    UPDATE 
    SET status = 'X', 
     reason = 'Missing (street 1)' 
    WHERE Target.session_id = 69 
    AND Target.userid = 'BS' 
    AND Target.status = 'A' 
    AND NVL(SOURCE.street1, ' ') = ' ') 

我得到的错误: ORA-00933: SQL command not properly ended

回答

0

最后的WHERE子句不合适。也许你需要这个:

MERGE 
    INTO um_valid Target 
    USING (
     select distinct id_number 
     from um_valid 
     where street1 is null 
    ) SOURCE 
    ON (
     Target.id_number = SOURCE.id_number 
     AND Target.session_id = 69 
     AND Target.userid = 'BS' 
     AND Target.status = 'A' 
    )     
    WHEN MATCHED THEN UPDATE SET 
     status = 'X', 
     reason = 'Missing (street 1)' 
+0

我尝试过了,现在我有一个diferent错误:ORA-00904: “源”, “STREET1”:无效的标识符。列名是STREET1 – user2127860 2013-03-27 19:06:12

+0

您确定它是STREET1吗?做一个描述。它是以大写显示吗?如果不是,请将案例与双引号环绕起来。例如:“street1”你可以从um_valid选择STREET1吗? – redcayuga 2013-03-27 20:26:03

0

您可以使用正常的更新语句。合并用于批量操作。 如果您需要在存在时更新某些内容,或者在不存在时插入,则可以使用合并语句。 因此,对于您的示例尝试使用以下:

UPDATE Valid 
SET status = 'X', 
    reason = 'Missing' 
WHERE session_id = 69 
AND userid = 'BS' 
AND status = 'A' 
AND street1 is null 

上面的语句将表中的“有效”,其中的session_id等于69更新所有行,用户ID等于BS,地位相当于A和street1为空(NULL)。

我认为这是你所需要的,如果不是这种情况,请让我知道你为什么加入有效的有效。我会调整我的更新。

0

这应该做到这一点:

UPDATE Valid a 
    SET status = 'X', 
     reason = 'Missing' 
    WHERE A.session_id = 69 
    AND A.userid = 'BS' 
    AND A.status = 'A' 
    AND exists (select null 
       from valid b 
       where a.id_number = b.id_number 
       AND coalesce(B.street1, ' ') = ' ')