Обновить синтаксис запроса при присоединении к запросу

0

У меня есть запрос, который вызывает все contacts, у которых есть 0 сделок в нашей системе и contact_status_c = Client. Запрос выглядит следующим образом:

SELECT
contacts.first_name,
contacts.last_name,
contacts.phone_home,
contacts.phone_mobile,
contacts.phone_work,
contacts.primary_address_street,
contacts.primary_address_city,
contacts.primary_address_state,
contacts.primary_address_postalcode,
contacts.primary_address_country,
opportunities_cstm.stage_c,
contacts_cstm.contact_status_c,
SUM(opportunities_cstm.stage_c = 'Pending'
OR opportunities_cstm.stage_c = 'AccountActive'
OR opportunities_cstm.stage_c = 'Reinstated'
OR opportunities_cstm.stage_c = '%Maturity%'
OR opportunities_cstm.stage_c = 'Flagged'
OR opportunities_cstm.stage_c = 'Stalled') AS deal_count
FROM
opportunities
JOIN opportunities_cstm
ON opportunities.id = opportunities_cstm.id_c
RIGHT JOIN contacts
ON opportunities_cstm.contact_id_c = contacts.id
JOIN contacts_cstm
ON contacts_cstm.id_c = contacts.id
WHERE
contacts.deleted = 0
AND opportunities.deleted = 0
AND contacts_cstm.contact_status_c <> 'Lost Client'
GROUP BY
contacts.id
HAVING deal_count = 0
ORDER BY
contacts.first_name ASC,
contacts.last_name ASC

Он вытягивает 175 контактов. Теперь я пытаюсь обновить все записи contact_status_c в таблице contacts_cstm чтобы отразить, что все 175 из этих клиентов перечислены как " Lost Clients вместо " Client. В этом и заключается проблема.

Первоначально я просто попытался использовать базовый оператор Update, чтобы сделать это, но поскольку он был слишком широким, он обновил 1881 запись вместо 175. Таким образом, я пришел к выводу, что мне нужно включить группу и иметь. Используя информацию, предоставленную по адресу:

https://stackoverflow.com/questions/8793914/using-a-having-clause-in-an-update-statement

(это один из самых полезных) и несколько других сообщений и статей, которые мне удалось написать:

UPDATE
    c_1
FROM
    contacts_cstm c_1
    JOIN (
        SELECT
            contacts.first_name,
            contacts.last_name,
            contacts.phone_home,
            contacts.phone_mobile,
            contacts.phone_work,
            contacts.primary_address_street,
            contacts.primary_address_city,
            contacts.primary_address_state,
            contacts.primary_address_postalcode,
            contacts.primary_address_country,
            opportunities_cstm.stage_c,
            contacts_cstm.contact_status_c,
            SUM(opportunities_cstm.stage_c = 'Pending'
            OR opportunities_cstm.stage_c = 'AccountActive'
            OR opportunities_cstm.stage_c = 'Reinstated'
            OR opportunities_cstm.stage_c = '%Maturity%'
            OR opportunities_cstm.stage_c = 'Flagged'
            OR opportunities_cstm.stage_c = 'Stalled') AS deal_count
        FROM
            Contacts_Cstm 
        RIGHT JOIN contacts
            ON opportunities_cstm.contact_id_c = contacts.id
        JOIN opportunities_cstm
            ON opportunities.id = opportunities_cstm.id_c
        JOIN opportunities
            ON opportunities_cstm.id_c = opportunities.id
        WHERE
            contacts.deleted = 0
            AND opportunities.deleted = 0
            AND contacts_cstm.contact_status_c <> 'Lost Client'
        GROUP BY
            contacts.id
        HAVING 
            deal_count = 0
    ) contacts_cstm as c_2
    ON
        c_1.id_c = c_2.id_c
    SET 
        contact_status_c = 'Lost Client'

К сожалению, он бросает "простую" синтаксическую ошибку:

Error : You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'FROM
    contacts_cstm c_1
    JOIN (
        SELECT
            contacts.first_name,
            contacts.las' at line 3

Я подробно рассмотрел литературу и несколько статей, но не смог понять, что здесь происходит. У меня такое чувство, что оно не имеет ничего общего с ошибкой, которую она бросает.

Любая помощь, безусловно, ценится. Заранее спасибо!

  • 0
    Это синтаксис SQL Server поэтому я не буду работать с MySQL.
  • 0
    Ах .. Имеет смысл. Хотя, по общему признанию, я не очень знаком с различиями в языке. Спасибо что подметил это!
Теги:
sql-update

1 ответ

0
Лучший ответ

У меня нет MySQL в моей системе, поэтому я не могу ее протестировать, но он должен быть похож на запрос ниже. Также вы не даете структуру таблицы, поэтому я предполагаю, что у вас есть столбец id.

UPDATE contacts_cstm a
JOIN (
    SELECT contacts.first_name,
        contacts.last_name,
        contacts.phone_home,
        contacts.phone_mobile,
        contacts.phone_work,
        contacts.primary_address_street,
        contacts.primary_address_city,
        contacts.primary_address_state,
        contacts.primary_address_postalcode,
        contacts.primary_address_country,
        opportunities_cstm.stage_c,
        contacts_cstm.id_c
        contacts_cstm.contact_status_c,
        SUM(opportunities_cstm.stage_c = 'Pending' OR opportunities_cstm.stage_c = 'AccountActive' OR opportunities_cstm.stage_c = 'Reinstated' OR opportunities_cstm.stage_c = '%Maturity%' OR opportunities_cstm.stage_c = 'Flagged' OR opportunities_cstm.stage_c = 'Stalled') AS deal_count
    FROM opportunities
    JOIN opportunities_cstm ON opportunities.id = opportunities_cstm.id_c
    RIGHT JOIN contacts ON opportunities_cstm.contact_id_c = contacts.id
    JOIN contacts_cstm ON contacts_cstm.id_c = contacts.id
    WHERE contacts.deleted = 0 AND opportunities.deleted = 0 AND contacts_cstm.contact_status_c <> 'Lost Client'
    GROUP BY contacts.id
    HAVING deal_count = 0
) b ON b.id_c = a.id_c
SET a.contact_status_c = 'Lost Client'
  • 0
    Нет необходимости во всех столбцах в списке SELECT подзапроса. Оптимизатор запросов почти наверняка проигнорирует их.
  • 0
    @ Barmar Это имеет GROUP BY и HAVING . Я не знаю, как это сработает, поэтому я заключаю весь запрос в подзапрос, что, вероятно, не является необходимым.
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню