SQL 如何通过 INNER JOIN 更新 -

Posted

技术标签:

【中文标题】SQL 如何通过 INNER JOIN 更新 -【英文标题】:SQL How to Update by INNER JOIN - 【发布时间】:2017-01-16 08:57:34 【问题描述】:

请帮我解决这个问题,因为我尝试了这个论坛的所有方法,但仍然没有找到解决方案。

嗯,我有两张桌子:

价格 制造商

我想更改表价格中的两个字段的值。 我只会给那些特定的值。

这些字段是:

prices.override(我想在其中赋值 0)和 prices.product_discount_id(我想在其中给出值 66)

但我只想更改 ID 为 31 的制造商的字段。

所以,我首先检查 INNER JOIN 是否正常工作。

SELECT manufacturers.manufacturer_id,
prices.product_id,
prices.product_price,
prices.override,
prices.product_discount_id
FROM manufacturers
INNER prices
ON manufacturers.product_id=prices.product_id
AND manufacturers.manufacturer_id=31;

但是当我尝试更新这两个字段时,我不知道如何使它工作。 例如,我试过这个,但它不起作用:

UPDATE prices
SET prices.override=1
FROM
INNER JOIN prices
ON manufacturers.product_id=prices.product_id
AND manufacturers.manufacturer_id=31;

我也试过这个:

UPDATE prices
SET prices.override=1, 
INNER JOIN manufacturers 
ON prices.virtuemart_product_id = manufacturers.virtuemart_product_id 
AND manufacturers.manufacturer_id=31;

我做错了什么?通常我得到的错误信息是:

#1064 - 您的 SQL 语法有错误;查看与您的 mysql 服务器版本相对应的手册,在第 3 行的“FROM jos_virtuemart_product_prices 价格 INNER JOIN jos_virtuemart_product_man”附近使用正确的语法

我读了一些别名,但仍然没有结果。

任何帮助将不胜感激!

【问题讨论】:

格式正确的问题,+1。 结构不佳的问题。 -1 见meta.***.com/questions/333952/… 【参考方案1】:

你有几个语法问题,MySQL UPDATE..JOIN 语法是:

UPDATE T
JOIN t2 ON()
SET ..
WHERE ..

其次,SET prices.override=1 后面有一个不必要的逗号,所以:

UPDATE prices
INNER JOIN manufacturers 
ON prices.virtuemart_product_id = manufacturers.virtuemart_product_id 
    AND manufacturers.manufacturer_id=31
SET prices.override=1 

【讨论】:

谢谢萨吉。你的建议效果很好!非常感谢!【参考方案2】:

如果你使用 SQL Server for mysql 试试这个就可以了:

UPDATE p SET p.override=1
FROM prices p 
INNER JOIN manufacturers ON 
     p.virtuemart_product_id =manufacturers.virtuemart_product_id 
    AND manufacturers.manufacturer_id=31;

【讨论】:

他特意说他用的是MySQL,问题标记为 MySQL ,错误为 MySQL 错误。此外,他和您的解决方案也不适用于 MySQL。 抱歉之前没有提到,可以查看编辑日志。是的,在回答之前没有询问 DBMS 是我的错。同意【参考方案3】:

这是 MySQL 中的正确语法:

UPDATE prices p JOIN
       manufacturers m
       USING (product_id)
    SET p.override=1
WHERE m.manufacturer_id = 31;

注意表别名的使用。这些使查询更易于编写和阅读。

您使用的语法适用于 SQL Server。

【讨论】:

我相信using 可能会让新程序员在学习标准语法之前感到困惑.. @sagi 。 . .我不确定您所说的“标准”语法是什么意思,因为 USINGON 都是 ANSI 标准结构。 我知道 USING 是 ANSI ,我的意思是几乎没有加入教程向程序员介绍 USING 除非他们专门搜索它【参考方案4】:

在 MySQL 中,UPDATEJOIN 语法不同,SET 运算符应位于 JOIN 语句之后。

正确的UPDATE查询是

UPDATE prices P
INNER JOIN manufacturers M ON P.virtuemart_product_id = M.virtuemart_product_id 
                             AND M.manufacturer_id = 31;
SET P.override = 1;

【讨论】:

【参考方案5】:
UPDATE prices  
SET prices.override=1  
FROM manufacturers  
INNER JOIN prices  
ON manufacturers.product_id=prices.product_id  
AND manufacturers.manufacturer_id=31;

【讨论】:

以上是关于SQL 如何通过 INNER JOIN 更新 -的主要内容,如果未能解决你的问题,请参考以下文章

带有 SELECT 和 INNER JOIN 的 SQL INSERT INTO

INNER JOIN与LEFT JOIN在SQL Server的性能

SQL中inner join,outer join和cross join的区别

(My)SQL 如何评估链式 LEFT/INNER JOIN?

如何在sql中创建INNER JOIN多个表

如何让 SQL INNER JOIN 接受空结果