在 SQL 中从另一个表更新一个表的最佳方法是啥?

Posted

技术标签:

【中文标题】在 SQL 中从另一个表更新一个表的最佳方法是啥?【英文标题】:What is the best way to update a one table from another in SQL?在 SQL 中从另一个表更新一个表的最佳方法是什么? 【发布时间】:2016-12-21 16:00:45 【问题描述】:

我有 2 个表,第一个是产品页面 visited

+------------+--------------+------+-----+---------+----------------+
| Field      | Type         | Null | Key | Default | Extra          |
+------------+--------------+------+-----+---------+----------------+
| id         | int(11)      | NO   | PRI | NULL    | auto_increment |
| idproduct  | varchar(128) | YES  |     | NULL    |                |
| logdate    | date         | YES  |     | NULL    |                |
| idmagasin  | int(20)      | YES  |     | NULL    |                |
| idenseigne | int(20)      | YES  |     | NULL    |                |
| commanded  | int(2)       | YES  |     | 0       |                |
+------------+--------------+------+-----+---------+----------------+

第二个是产品命令

+-------------+--------------+------+-----+-------------------+----------------+
| Field       | Type         | Null | Key | Default           | Extra          |
+-------------+--------------+------+-----+-------------------+----------------+
| id          | int(11)      | NO   | PRI | NULL              | auto_increment |
| idproduct   | varchar(255) | NO   |     | NULL              |                |
| idenseigne  | int(11)      | NO   |     | NULL              |                |
| idmagasin   | int(11)      | NO   |     | NULL              |                |
| ingredients | tinytext     | YES  |     | NULL              |                |
| date        | timestamp    | NO   |     | CURRENT_TIMESTAMP |                |
+-------------+--------------+------+-----+-------------------+----------------+

如何更新 product_visited 中的 commandedif product_visited.idproduct = product_commanded.idproduct and product_visited.logdate = product_commanded.date

我对使用 inner joinexists 感到困惑

当product_commanded中存在logdateidproduct的值时,我想update product_visited.commanded = 1这意味着访问的产品也被命令了

【问题讨论】:

您想加入表,使用存在不会让您使用子查询中的任何字段来更新您的主表。 您将您提到的谓词条件放入更新语句中的 where 子句中。但是要获得完整的 SQL,您必须告诉我们要将列 commanded 更新为哪个值(或可以评估的表达式)。 @RichBenner 我阅读了“加入”的文档,但是当我们加入时,我们可以同时更新表格吗? 顺便说一句,你所有的id_* 字段都应该有一个索引(简单或唯一,我让你选择)。它将加快您的查询速度 @parik,取决于您使用的数据库供应商。 SQL Server、mysql、Oracle 的语法略有不同... 【参考方案1】:

我相信这就是您正在寻找的:

Update product_visited pv
    set commanded = 1
    Where exists (Select 1
                  from product_commanded pc
                  where pv.idproduct = pc.idproduct and pv.logdate = pc.date
                 );

【讨论】:

我现在不能投票,非常感谢,这正是我搜索的内容【参考方案2】:

好的,我已经对连接字段进行了猜测,但您正在寻找这样的东西;

UPDATE pv
SET pv.Commanded = 1
FROM Product_Visited pv
JOIN Product_Commanded pc
    ON pv.logdate = pc.date
    AND pv.idproduct = pc.id

内连接意味着您只会根据您提供的连接谓词更新 Product_Visited 中的记录,其中 Product_Commanded 中有匹配的行。

注意:这是一个 SQL Server 答案。在 MySQL 中可能工作也可能不工作

【讨论】:

【参考方案3】:

听起来您想在commanded 表中存在同一产品的记录时更新commanded

在任何数据库中:

Update product_visited set commanded = 1
Where exists(Select * from product_commanded
             where product_id = product_visited.Product_id)

【讨论】:

这是标准 SQL,应该适用于任何数据库。 @Gordon,是的,我开始使用在 mySQL 中不同的代码 @Gordon,(和@parik),您需要 Exists 子查询中 logdate 的谓词吗?

以上是关于在 SQL 中从另一个表更新一个表的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

更新闭包表的最佳方法是啥?

在使用表时更新表中数据而不锁定表的最佳方法是啥?

Oracle SQL:选择超大表的子集的最佳方法是啥

在 Access 中从另一个表的数据创建一个表

在单个查询中从他们的 ID 获取相关数据的最佳方法是啥?

SQL Dev:使用where语句从另一个表的列更新列