我有两个带有关系的表格,我想更新表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
答案 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
中。如果您不喜欢使用t
或t2
使用您喜欢的任何别名 - 这没关系 - 我只是喜欢使用它们。
答案 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';