结合update语句和select语句

时间:2016-07-05 13:16:44

标签: sql oracle

我正在使用Oracle SQL Developer,我尝试将更新和选择状态合并为一个。我知道Oracle在更新语句中直接支持FROM或JOINS,因此我将select放在子查询中但它仍然不起作用。

我有两张桌子; MASTERTABLE和TESTTABLE。

MASTERTABLE包含ID_NUMBER列和TESTTABLE_ID列。

TESTTABLE包含TESTTABLE_ID列和TEST_COLUMN列。

我想要做的是更新TEST_COLUMN值,同时只知道ID_NUMBER。

我的陈述是什么样的:

<script src="/js/jquery-1.12.1.min.js" type="text/javascript"></script>
<script src="js/jquery.tablesorter.min.js"></script>
<head>
<script>
function sort_my_table(){
$('my_table').tablesorter();
}
</script>
</head>

但我陷入了某种循环。我哪里出错了?

3 个答案:

答案 0 :(得分:0)

我遇到了同样的问题。解决方案是使用MERGE操作而不是UPDATE

        MERGE INTO TESTTABLE t
        USING 
        (
          SELECT m.ID_NUMBER num,
                 m.TESTTABLE_ID id
          FROM MASTERTABLE m
        ) newnum ON (t.TESTTABLE_ID = newnum.id)
        WHEN MATCHED THEN UPDATE 
        SET t.TEST_COLUMN = newnum.num;

答案 1 :(得分:0)

您可以在Oracle中尝试其中任何一项

正常更新

UPDATE
      TESTTABLE
SET
      TEST_COLUMN= 'Testvalue'
WHERE
      EXISTS
          (SELECT MASTERTABLE.TESTTABLE_ID 
           FROM MASTERTABLE 
           WHERE ID_NUMBER=11);

使用内嵌视图(如果Oracle认为可以更新)

注意:如果您遇到非密钥保留行错误,请添加索引以解析相同内容以使其可更新

UPDATE
      (SELECT
            TESTTABLE.TEST_COLUMN AS OLD,
            'Testvalue' AS NEW
       FROM
                TESTTABLE
            INNER JOIN
                MASTERTABLE
            ON TESTTABLE.TESTTABLE_ID = MASTERTABLE.TESTTABLE_ID
       WHERE ID_NUMBER=11) T
SET
      T.OLD     = T.NEW;

使用合并

MERGE INTO
      TESTTABLE
USING
      (SELECT
            T1.ROWID AS RID,
            T2.TESTTABLE_ID
       FROM
                TESTTABLE T1
            INNER JOIN
                MASTERTABLE T2
            ON TESTTABLE.TESTTABLE_ID = MASTERTABLE.TESTTABLE_ID
       WHERE ID_NUMBER=11)
ON
      ( ROWID = RID )
WHEN MATCHED
THEN
    UPDATE SET TEST_COLUMN= 'Testvalue';

答案 2 :(得分:0)

问题在于Tom H写了一个阻塞问题。当我今天开始研究项目时,所有的解决方案都有效。