更新和左外连接语句

时间:2011-06-13 19:38:34

标签: sql-server visual-studio tsql

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

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

我正在使用MS SQL

5 个答案:

答案 0 :(得分:51)

Update t 
SET 
       t.Column1=100
FROM 
       myTableA t 
LEFT JOIN 
       myTableB t2 
ON 
       t2.ID=t.ID

myTableA替换为您的表名,并将Column1替换为您的列名。

这之后只需LEFT JOIN到tableB。在这种情况下,t只是myTableA的别名。 t2是您的联接表的别名,在我的示例myTableB中。如果您不喜欢使用tt2使用您喜欢的任何别名 - 这没关系 - 我只是喜欢使用它们。

答案 1 :(得分:7)

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

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

WHERE customers.customer_name = suppliers.supplier_name)

答案 2 :(得分:4)

另一个示例,其中表1中的列的值插入到表2中的列中:

UPDATE  Address
SET     Phone1 = sp.Phone
FROM    Address ad LEFT JOIN Speaker sp
ON      sp.AddressID = ad.ID
WHERE   sp.Phone <> '' 

答案 3 :(得分:2)

此查询中的左连接是没有意义的:

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

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

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

答案 4 :(得分:0)

在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';