【问题标题】:SQL ORACLE ORA-00969: missing ON keyword?SQL ORACLE ORA-00969:缺少 ON 关键字?
【发布时间】:2011-09-28 01:44:55
【问题描述】:

我有两个不同的表:Table_a 和 Table_b,它们都有相同的 PartNo 和 Material_Desc 列。当 PartNo 相等时,我希望 Table_b 中的 Material_Desc 更新 Table_a 中的 Material_Desc。这是我的查询

MERGE INTO Table_b 
USING ( SELECT t1.rowid AS rid
               , t2.Material_Desc
        FROM Table_b t1 
           JOIN Table_a t2 
           ON Table_b.PartNo = Table_a.PartNo ) 
ON rowid = rid 
WHEN MATCHED THEN 
    UPDATE 
    SET Table_a.Material_Desc = Table_b.Material_Desc;

我知道 Oracle 不支持更新语句的连接,所以我尝试了上述查询。它仍然给我 ORACLE ORA-00969: missing ON 关键字错误

【问题讨论】:

标签: sql oracle


【解决方案1】:

您可以输入“(”和“)”。所以写:

开启 ( rowid = rid )

【讨论】:

    【解决方案2】:

    首先,语法问题:当你使用子查询进行合并时,你必须给它起别名。但更重要的是,您不需要使用子查询。

    MERGE INTO Table_a USING Table_b ON (Table_a.PartNo = Table_b.PartNo) 
    WHEN MATCHED THEN UPDATE SET Table_a.Material_Desc = Table_b.Material_Desc
    

    首先,您必须将要更新的表放入INTO 部分。其次,在子选择中进行连接并在 rowid 上合并不会给您带来任何我能想到的好处。

    【讨论】:

    • 我得到 ORA-30926: 无法在源表中获得稳定的行集 上述查询错误
    • 也许这有助于理解 ORA-30926:forums.oracle.com/forums/thread.jspa?threadID=257751 见最后一条评论。
    • 对不起,我没有从上面链接的最后评论中得到它。请帮助我。
    【解决方案3】:

    可能不如合并语句高效,但应该可以完成工作:

    update table_b tb
    set tb.Material_Desc = (select ta.Material_Desc 
                            from   table_a ta 
                            where  ta.PartNo = tb.PartNo
                            and    rownum = 1
                           )
    where tb.rowid in (
                      SELECT t1.rowid                       
                        FROM Table_b t1 
                            , Table_a t2 
                        WHERE  t1.PartNo = t2.PartNo
                       )
    

    【讨论】:

    • 此查询给出 ORA-01427:单行子查询返回多行错误。
    • @sailaja:我假设 partno 是独一无二的。我已经调整了我的答案,所以只取第一个找到的条目
    • 否,每个 Part_No 都有多个值,例如 ex.001A 有 100 个项目,001B 有 50 个项目具有唯一的 Serial_No,但描述相同,所以我有另一个表(table_a),它只包含 PartNo & Material_Desc,我想从这个表中更新这些 PartNo 的所有描述_a
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-16
    • 1970-01-01
    • 2010-09-23
    • 2017-10-18
    • 2023-03-22
    相关资源
    最近更新 更多