У меня есть запрос, который вызывает все 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
Я подробно рассмотрел литературу и несколько статей, но не смог понять, что здесь происходит. У меня такое чувство, что оно не имеет ничего общего с ошибкой, которую она бросает.
Любая помощь, безусловно, ценится. Заранее спасибо!
У меня нет 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'
SELECT
подзапроса. Оптимизатор запросов почти наверняка проигнорирует их.
GROUP BY
и HAVING
. Я не знаю, как это сработает, поэтому я заключаю весь запрос в подзапрос, что, вероятно, не является необходимым.
SQL Server
поэтому я не буду работать с MySQL.