问题描述
|
我有两个具有关系的表格,并且我想更新表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
解决方法
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
,请使用您喜欢的任何别名-没关系-我只是喜欢使用那些别名。
, 如果您需要的是SELECT语句中的UPDATE,则可以执行以下操作:
UPDATE suppliers
SET city = (SELECT customers.city FROM customers
WHERE customers.customer_name = suppliers.supplier_name)
, 另一个示例是将表1中的列值插入表2中的列:
UPDATE Address
SET Phone1 = sp.Phone
FROM Address ad LEFT JOIN Speaker sp
ON sp.AddressID = ad.ID
WHERE sp.Phone <> \'\'
, 此查询中的Left连接毫无意义:
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_order_ecolid
中是否存在匹配的行,它都会更新pd_mounting_details
的所有行。如果您只想更新匹配的行,则应为内部联接。
如果要基于是否发生连接应用某些条件,则需要在SET
子句中添加WHERE
子句和/或CASE
表达式。
, 在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\';