更新和左外连接语句

Evi*_*aid 28 t-sql sql-server visual-studio

我有两个表关系,我想更新表A中的字段.是否可以在同一个查询中组合更新和连接?我用Google搜索但没有找到任何有效的解决方案?

UPDATE md SET md.status = '3' 
FROM pd_mounting_details AS md 
LEFT OUTER JOIN pd_order_ecolid AS oe ON md.order_data = oe.id
Run Code Online (Sandbox Code Playgroud)

我正在使用MS SQL

Jon*_*onH 56

Update t 
SET 
       t.Column1=100
FROM 
       myTableA t 
LEFT JOIN 
       myTableB t2 
ON 
       t2.ID=t.ID
Run Code Online (Sandbox Code Playgroud)

替换myTableA为您的表名称并替换Column1为您的列名称.在此之后只需LEFT JOIN到tableB. t在这种情况下只是一个别名myTableA

  • 外连接版本毫无意义,因为无论如何每行都会更新.内部连接版本是不必要的 - EXISTS子查询实现了相同的功能(与错误连接语法不同,EXISTS是标准SQL.) (3认同)

kle*_*had 7

如果您需要的是SELECT语句的UPDATE,您可以执行以下操作:

UPDATE suppliers    
SET city = (SELECT customers.city FROM customers

WHERE customers.customer_name = suppliers.supplier_name)
Run Code Online (Sandbox Code Playgroud)


Cso*_*mai 7

在MySQL的SET条款需要拿出JOIN。例子:

UPDATE e
    LEFT JOIN a ON a.id = e.aid
    SET e.id = 2
    WHERE  
        e.type = 'user' AND
        a.country = 'US';
Run Code Online (Sandbox Code Playgroud)

  • 这是唯一对我有用的东西。谢谢! (2认同)

Til*_*ito 6

另一个示例是将表1中的列值插入表2中的列:

UPDATE  Address
SET     Phone1 = sp.Phone
FROM    Address ad LEFT JOIN Speaker sp
ON      sp.AddressID = ad.ID
WHERE   sp.Phone <> '' 
Run Code Online (Sandbox Code Playgroud)


Dam*_*ver 5

此查询中的左连接毫无意义:

UPDATE md SET md.status = '3' 
FROM pd_mounting_details AS md 
LEFT OUTER JOIN pd_order_ecolid AS oe ON md.order_data = oe.id
Run Code Online (Sandbox Code Playgroud)

它将更新 的所有行pd_mounting_details,无论 中是否存在匹配的行pd_order_ecolid。如果您只想更新匹配的行,那么它应该是内部联接。

如果您想根据连接是否发生来应用某些条件,则需要在子句中添加WHERE子句和/或表达式。CASESET