【问题标题】:update table with join without PK in oracle在 oracle 中使用无 PK 的连接更新表
【发布时间】:2012-08-07 14:28:12
【问题描述】:
UPDATE
  (
    SELECT
      a.COL1
    FROM
      TABLE1 a,
      TABLE2 b,
      TABLE3 c
    WHERE
      a.name = b.name
      c.ccol = b.ccol AND
      AND b.col1 = 'anyvalue'
      AND a.col2 = 'anothervalue'
  ) u
SET
  u.COL1 = 'VALUE'

此查询不起作用,因为 TABLE1 不包含 PK。如何编写这样的查询?

【问题讨论】:

    标签: sql oracle sql-update


    【解决方案1】:

    以下应该实现您在上面尝试实现的目标:

    UPDATE  TABLE1
    SET     COL1 = 'VALUE'
    WHERE   EXISTS
            (   SELECT  1
                FROM    TABLE2 B
                        INNER JOIN TABLE3 C
                            ON B.Ccol = C.Ccol
                WHERE   b.Name = Table1.Name
                AND     b.Col1 = 'AnyValue'
                AND     c.Col1 = 'AnotherValue'
            )
    

    【讨论】:

    • OP 的 SQL 更新是 Oracle 中的有效语法。是的,如果 TABLE1 不包含主键,此查询将失败
    • @Anton 我已经从答案中删除了关于更新子查询的部分。
    【解决方案2】:

    我从未在 oracle 中工作过,但可以试试这样的东西。只要您的 join & where 语句正确,没有 pk 应该不是问题。

    这是您要求的 SQL 等价物

    UPDATE u
      SET  u.COL1 = 'VALUE'
      FROM Table1 AS u
      INNER JOIN Table2 AS b ON u.name  = b.name 
      INNER JOIN Table3 AS c ON c.ccol  = b.ccol 
     WHERE b.col1 = 'anyvalue'  AND u.col2 = 'anothervalue'
    

    【讨论】:

    • 您不能在 Oracle 中执行 UPDATE FROM ... JOIN ... :)
    • 啊,谢谢! :),现在我也知道了。我确实注意到他的语法有点奇怪,我想我可以试着回答一下。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多