Обновить и оставить внешние операторы соединения - PullRequest
28 голосов
/ 13 июня 2011

У меня есть две таблицы с отношением, и я хочу обновить поле в таблице 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 ]

51 голосов
/ 13 июня 2011
Update t 
SET 
       t.Column1=100
FROM 
       myTableA t 
LEFT JOIN 
       myTableB t2 
ON 
       t2.ID=t.ID

Замените myTableA на имя таблицы и замените Column1 на имя столбца.

После этого просто ВЕРНУТЬСЯ В СВЯЗЬ с таблицей B.t в данном случае это просто псевдоним для myTableA.t2 - это псевдоним для вашей объединенной таблицы, в моем примере это myTableB.Если вам не нравится использовать t или t2, используйте любое псевдоним, который вы предпочитаете - это не имеет значения - мне просто нравится их использовать.

7 голосов
/ 14 июня 2011

Если вам нужно UPDATE из оператора SELECT, вы можете сделать что-то вроде этого:

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

WHERE customers.customer_name = suppliers.supplier_name)
4 голосов
/ 19 января 2012

Еще один пример, в котором значение столбца из таблицы 1 вставляется в столбец таблицы 2:

UPDATE  Address
SET     Phone1 = sp.Phone
FROM    Address ad LEFT JOIN Speaker sp
ON      sp.AddressID = ad.ID
WHERE   sp.Phone <> '' 
2 голосов
/ 14 июня 2011

Левое соединение в этом запросе бессмысленно:

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.

0 голосов
/ 13 мая 2019

В 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';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...