【问题标题】:UPDATE with JOIN and condition SQL使用 JOIN 和条件 SQL 进行更新
【发布时间】:2020-03-30 18:48:58
【问题描述】:

我有 2 个表,我正在尝试使用第二个表中的数据更新其中一个列中的一列。我的SQL如下:

UPDATE 
        table_one
SET 
        contents = CONCAT('https://someurl.com/', table_one.id, '.', split_part(T2.file_name, '.', 2))  
FROM 
        table_one T1
JOIN 
        table_two T2
ON 
        T1.id = T2.image_id
WHERE   
        T1.kind IN ('image')

我要做的是获取表table_twofile_name 列的值,并将其插入table_onecontents 列中,以获取给定的ID 和类型“图像” table_1 的列。所以更新应该只对 kind='image' 的记录进行。split 和 concat 部分是为了获取文件的扩展名。

这可行,但它会更新所有条目,而不考虑设置为“图像”的种类。此外,它似乎获得了所有相同的值,因为所有扩展都设置相同。

谁能指出我做错了什么?

更新:我正在使用 Postgres。

谢谢。

【问题讨论】:

  • 您使用的是哪个 dbms?
  • 您好,我怀疑问题是您没有使用更新的别名,如下面的 UPDATE T1 SET T1.contents = CONCAT('someurl.com', T1.id, '.', split_part(T2.file_name, '.', 2)) FROM table_one T1 JOIN table_two T2 ON T1.id = T2.image_id WHERE T1.kind IN ('image')
  • 请阅读sql tag text,然后用您正在使用的RDMS标记您的问题,提供示例数据、当前输出和所需输出。
  • 我正在使用 Postgres。

标签: sql postgresql join sql-update


【解决方案1】:

As documented in the manual在FROM子句中不要重复目标表:

UPDATE table_one t1
  SET contents = CONCAT('https://someurl.com/', table_one.id, '.', split_part(T2.file_name, '.', 2))  
FROM table_two T2
WHERE T1.id = T2.image_id
  AND T1.kind IN ('image')

【讨论】:

  • 感谢您的帮助!
【解决方案2】:

您已将 table_one 连接到自身,连接没有条件。因此,您有一个笛卡尔连接,并且每一行都会更新。 T1.kind IN ('image') 无所谓,因为你不是在更新 T1,而是在更新 table_one。

Heed the warning:

请注意,目标表不得出现在from_list 中,除非您打算进行自联接(在这种情况下,它必须与别名一起出现在 from_list 中)。

只需重写而不连接到 T1。您必须将连接条件从 ON 移动到 WHERE,因为无法将 ON 与隐式连接一起使用。

UPDATE 
        table_one
SET 
        contents = CONCAT('https://someurl.com/', table_one.id, '.', split_part(T2.file_name, '.', 2))  
FROM 
        table_two T2
WHERE   
        table_one.kind IN ('image') and table_one.id=t2.image_id

【讨论】:

    猜你喜欢
    • 2013-01-07
    • 2014-02-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-31
    • 1970-01-01
    • 2020-03-20
    • 1970-01-01
    • 2016-09-29
    相关资源
    最近更新 更多