Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 基于其他表中的值更新表_Sql_Oracle - Fatal编程技术网

Sql 基于其他表中的值更新表

Sql 基于其他表中的值更新表,sql,oracle,Sql,Oracle,这相当简单,我想更新一个表,但前提是满足另一个表中的条件。 我当前的查询: UPDATE Table1 SET Table1.value='1234' WHERE ID IN ( (A sub query returning all the id's needed) ) 这种方法可以工作,但它会更新许多值。 问题在于还有第二个条件,即: AND Table2.value = 'Pudding' 但是,看到它是一个不同的表,它不工作。我不知道如何加入甲骨文。看过其他一些帖子,

这相当简单,我想更新一个表,但前提是满足另一个表中的条件。 我当前的查询:

UPDATE Table1
SET Table1.value='1234'
WHERE   ID IN 
(   
  (A sub query returning all the id's needed) 
)
这种方法可以工作,但它会更新许多值。 问题在于还有第二个条件,即:

AND Table2.value = 'Pudding'
但是,看到它是一个不同的表,它不工作。我不知道如何加入甲骨文。看过其他一些帖子,但它们似乎与我的具体问题无关。尝试添加带有连接的From子句,我也在子查询中使用了该子句,但在oracle的update语句中找不到该子句

编辑:示例数据库

表1

ID    Key1     Key2     Value
1    A1       B1       345
2    A1       B2       75
3    A2       B1       45 
表2

Key1     Key2     Value
A1       B1       'Pudding'
A1       B2       'Pudding'
A2       B1       'Something else' 
是的,表2也是子查询的一部分,但是其他6个表也是。我相信列出子查询的整个结构只会让人更加困惑,因为它会带来一系列已经可以正常工作的Id

但结果是,需要更新示例中的前两行

您可以尝试像这样与子查询一起使用,因为表中有两列需要比较

UPDATE Table1 t1
SET t1.Value = '1234'
WHERE t1.ID IN 
    (   
      --(A sub query returning all the id's needed) 
    ) 
and 
    exists (
     select 1 
     from Table2 t2
     where t1.Key2 =t2.Key2 and t1.Key1 =t2.Key1 and t2.Value = 'Pudding'
    )
这是一个样本

CREATE TABLE Table1(
  ID INT,
  Key1 VARCHAR(50),
  Key2 VARCHAR(50),
  Value VARCHAR(50)
);

INSERT INTO Table1 VALUES (1,'A1','B1','345');
INSERT INTO Table1 VALUES (2,'A1','B2','75');
INSERT INTO Table1 VALUES (3,'A2','B1','45');

CREATE TABLE Table2(
  Key1 VARCHAR(50),
  Key2 VARCHAR(50),
  Value VARCHAR(50)
);

INSERT INTO Table2 VALUES ('A1','B1','Pudding'); 
INSERT INTO Table2 VALUES ('A1','B2','Pudding'); 
INSERT INTO Table2 VALUES ('A2','B1','Something else'); 

UPDATE Table1 t1
SET t1.Value = '1234'
WHERE  exists (
 select 1 
 from Table2 t2
 where t1.Key2 =t2.Key2 and t1.Key1 =t2.Key1 and t2.Value = 'Pudding'
)
查询1

select * from Table1
| ID | KEY1 | KEY2 | VALUE |
|----|------|------|-------|
|  1 |   A1 |   B1 |  1234 |
|  2 |   A1 |   B2 |  1234 |
|  3 |   A2 |   B1 |    45 |

select * from Table1
| ID | KEY1 | KEY2 | VALUE |
|----|------|------|-------|
|  1 |   A1 |   B1 |  1234 |
|  2 |   A1 |   B2 |  1234 |
|  3 |   A2 |   B1 |    45 |

样本数据和期望的结果将非常有用。我看不出
Table2
与您的查询有什么关系。子查询是访问
Table2
来获取ID,还是其他什么?这两张表有什么关联吗?是的,样本数据将有助于解释。@AlexPoole和Gordon我用样本数据更新了问题,并解释了为什么我没有进行整个子查询。这是可行的,但我有一个小问题。我以前从未使用过Exists,我想知道为什么“选择1”?该函数有什么功能?
如果子查询返回至少一行,则为TRUE
<代码>选择1表示子查询中的条件匹配`