Думаю, я теряю его! : -/Почему этот MySQL UPDATE с подзапросом действует странно?
Итак, у меня есть этот запрос UPDATE MySQL ...
UPDATE `Jobs`
SET `Archived` = 'Y'
WHERE `JobCode` IN (
SELECT `JobCode` FROM (
SELECT m.`JobCode`
FROM `Jobs` as jx
JOIN (
SELECT j.`JobCode`, MAX(c.`CutDate`) AS MaxCutDate
FROM `Cuts` AS c
LEFT JOIN `Jobs` AS j ON (j.`JobCode`=c.`JobCode`)
GROUP BY j.`JobCode`
) AS m ON (m.`JobCode`=jx.`JobCode`)
WHERE m.MaxCutDate < '2014-01-01'
) AS tmp_table
)
Таблица Customers
, Jobs
и Cuts
являются частью простой реляционной группы. Customers
имеют несколько Jobs
, Jobs
имеют несколько Cuts
. Я оставил эту сложность для моего вопроса здесь, потому что я не уверен, является ли это частью проблемы или нет, и не хотел, чтобы упростить проблему.
Целью запроса является установка Jobs
. Archived
до 'Y'
для всех Jobs
тех, у кого не было Cut
запись создана с: 2014-01-01 OK
, в соответствии с Cuts
. CutDate
поле. Казалось, достаточно просто в то время.
Итак, проблема в этом; В следующем разделе запроса правильно выдает один результат столбца, содержащий только JobCode
, которые не имеют записей Cut
файла с номером Cut
. CutDate
так 2014-01-01
...
Это работает как задумано ...
SELECT `JobCode` FROM (
SELECT m.`JobCode`
FROM `Jobs` as jx
JOIN (
SELECT j.`JobCode`, MAX(c.`CutDate`) AS MaxCutDate
FROM `Cuts` AS c
LEFT JOIN `Jobs` AS j ON (j.`JobCode`=c.`JobCode`)
GROUP BY j.`JobCode`
) AS m ON (m.`JobCode`=jx.`JobCode`)
WHERE m.MaxCutDate < '2014-01-01'
) AS tmp_table
[Примечание: Двойной SELECT (SELECT ...))), чтобы получить вокруг глупой, но хорошо известная проблема с MySQL , Я не вижу здесь проблем. ]
В качестве примера выше может произвести следующие ...
JobCode
-------
930
935
936
Там случается быть JobCode
«s 931 через 934 в Jobs
таблице. Это не, включенные в вышеуказанные результаты, потому что у них нет Cut
записей с CutDate
в последнее время, чем 2014-01-01
. Это то, чего я хочу и чего я ожидал.
ОДНАКО ... когда я запускаю полный запрос, включая UPDATE
часть ...
UPDATE `Jobs`
SET `Archived` = 'Y'
WHERE `JobCode` IN (
SELECT `JobCode` FROM (
SELECT m.`JobCode`
FROM `Jobs` as jx
JOIN (
SELECT j.`JobCode`, MAX(c.`CutDate`) AS MaxCutDate
FROM `Cuts` AS c
LEFT JOIN `Jobs` AS j ON (j.`JobCode`=c.`JobCode`)
GROUP BY j.`JobCode`
) AS m ON (m.`JobCode`=jx.`JobCode`)
WHERE m.MaxCutDate < '2014-01-01'
) AS tmp_table
)
... то хорошо, сумасшедшие вещи, кажется, бывает! Что я ожидают, так это то, что ТОЛЬКО Jobs
записи, которые есть в выходе из SELECT
, должны обновляться. Но случайные другие записи Jobs
также делают! Я говорю «случайный», потому что: а) я не могу найти рифму или причину для них.
Итак, в этом проблема. Пожалуйста, о, милая, довольно пожалуйста ... WTF я здесь пропал?
Спасибо, связка!
вы можете попробовать это: UPDATE 'Jobs' SET' Archived' = WHERE 'JobCode' IN ( ВЫБОР m.'JobCode' FROM' Jobs', как JX JOIN ( ВЫБОР j.' 'Y' JobCode', MAX (c.'CutDate') AS MaxCutDate ОТ 'Cuts' AS c LEFT JOIN' Работа' AS j ON (j.'JobCode' = c.'JobCode') GROUP BY j.'JobCode' ) AS m ON (m.'JobCode' = jx.'JobCode') ГДЕ m.MaxCutDate <'2014-01-01' ) –