【问题标题】:how to update single column in one table when two column are match in another table?当另一个表中的两列匹配时,如何更新一个表中的单个列?
【发布时间】:2018-10-18 01:15:11
【问题描述】:

我是 SQL 初学者。

我有两张桌子,比如第一张,第二张。

第一个表的pid 列和第二个表的pid 列相同。我必须从第一个表中获取price,从第二个表中获取quantity,将这些值(最终)相乘并在第二个表中的price 列中更新该最终值。

我试过了,但它不起作用。谁能帮我?提前致谢。

第一张桌子

Name   Null?    Type         
------ -------- ------------ 
PID    NOT NULL NUMBER(38)   
PNAME  NOT NULL VARCHAR2(20) 
PPRICE NOT NULL FLOAT(126)   
PAVAIL NOT NULL NUMBER(38)  

第二张桌子

Name         Null?    Type         
------------ -------- ------------ 
ORDERID      NOT NULL NUMBER(38)   
PID                   NUMBER(38)   
CUSTOMERNAME NOT NULL VARCHAR2(20) 
PHNO         NOT NULL NUMBER(38)   
QTY          NOT NULL NUMBER(38)   
PRICE        NOT NULL FLOAT(126) 

我使用了这个查询,但它不起作用:

update first f, second s
SET s.price = f.pprice * s.qty
where  s.pid  EXISTS (select second.pid from first, second
                      where (first.pid=second.pid);

【问题讨论】:

  • 您使用的是哪个 dbms? (该更新版本是特定于产品的。)
  • 我正在使用oracle sql developer

标签: sql oracle select sql-update


【解决方案1】:

检查此声明:

update second s
set s.price = s.qty * (select f.pprice from first f where f.pid = s.pid )
where exists (select f.pprice from first f where f.pid = s.pid );

【讨论】:

    【解决方案2】:

    使用连接进行更新是通过 Oracle 中的 MERGE 语句完成的,这正是您所需要的。在你的情况下:

    MERGE INTO second a
         USING FIRST b
            ON (a.pid = b.pid)
    WHEN MATCHED
    THEN
       UPDATE SET a.price = b.price * a.qty;
    

    【讨论】:

    • 请不要诋毁别人的答案,告诉他们你的答案要好得多。
    • 当我说得更好时,我指的是 MERGE 语法,而不是我的答案。我认为我的语言可能会被误解。我会更新我的评论。如果冒犯了您,我们深表歉意。
    【解决方案3】:

    你也可以试试这个..

    更新 设置 s.price = 数量 * f.pprice 从第二个 s,第一个 f 其中 s.pid = f.pid

    如果有任何错误..回复我

    【讨论】:

      【解决方案4】:

      Oracle 不支持更新连接语法。一种解决方法是使用具有相关子查询的更新。

      UPDATE second s
      SET s.price = s.qty * (SELECT f.pprice FROM first f WHERE f.pid = s.pid)
      WHERE EXISTS (SELECT 1 FROM first f WHERE f.pid = s.pid)
      

      exists 子句是必要的,以确保second 中与first 中的任何内容都不匹配的记录不会将其价格更新为NULL。如果这不会发生,或者您不在乎它是否发生,那么您也可以删除 WHERE 子句。

      【讨论】:

      • 什么意思(SELECT 1 FROM first f WHERE f.pid = s.pid)
      • 我在回答中解释了这一点。也许重新加载你的页面。
      • Oracle 确实支持使用连接进行更新/插入。 MERGE 语句可以做到这一点,而且它也非常强大。
      猜你喜欢
      • 2020-10-08
      • 1970-01-01
      • 2020-06-23
      • 2011-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-02
      相关资源
      最近更新 更多