Я давно не видел ColdFusion ... этот тег CFQUERY
возвращает хорошие воспоминания :)
Если вы выполняете тот же запрос UPDATE
для нескольких записей, выдолжен выполнить один пакетный запрос (как вы предложили).Чтобы сделать это для всех магазинов, вы можете использовать вариант вашего запроса findStores
в качестве источника для ваших UPDATE
s, что-то вроде этого:
<!--- Update status --->
<cfquery name="updateStatus" datasource="test">
UPDATE store_status tgt
FROM (
-- findStores query
SELECT store_id, year_id, start_dt, end_dt
FROM stores
WHERE store_type_id IN (5,6,7,8,9,10)
) src
SET start_date = src.start_dt,
end_date = src.end_dt,
last_update_date = getDate()
WHERE status_id = (
SELECT status_id
FROM store_status
WHERE store_id = src.store_id
AND year_id = src.year_id
)
</cfquery>
<!--- Update store info --->
<cfquery name="updateStoreDoc" datasource="test">
UPDATE store_doc tgt
FROM (
-- findStores query with MAX(status) calculation
SELECT
st.store_id, st.year_id, st.start_dt, st.end_dt,
MAX(stt.status_id) AS status_id_max
FROM stores st
LEFT JOIN store_status stt ON st.store_id = stt.store_id -- Get status info
AND st.year_id = stt.year_id
WHERE st.store_type_id IN (5,6,7,8,9,10)
GROUP BY 1,2,3,4
) src
SET approve_start_date = src.start_dt,
approve_end_date = src.end_dt,
status_id = src.status_id_max
WHERE store_id = src.store_id
AND year_id = src.year_id
</cfquery>
Я не уверен, что ваша базовая СУБДподдерживает этот синтаксис и то, как Cold Fusion
будет его обрабатывать, поэтому может потребоваться некоторая обработка, чтобы заставить его работать.
Кроме того, что именно вы пытаетесь сделать в запросе updateStatus
?Вы ссылаетесь на status_id
в своем предложении WHERE
, но не на store_id
и year_id
.Напротив, запрос updateStoreDoc
ссылается на оба этих поля в предложении WHERE
.Я не уверен, что приведенный выше запрос будет работать правильно для updateStatus
в этой форме без ссылки на PK таблицы.
И последнее, что нужно учитывать, это то, что таблица store_status
обновляется в первомпакетный запрос, а затем ссылка во втором пакетном запросе.Возможно, вам придется изменить порядок этих запросов в зависимости от ожидаемого конечного результата.