在 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 中的 commanded 列 if product_visited.idproduct = product_commanded.idproduct and product_visited.logdate = product_commanded.date
我对使用 inner join 或 exists 感到困惑
当product_commanded中存在logdate
和idproduct
的值时,我想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 中从另一个表更新一个表的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章