Задавайте вопросы, мы ответим
Вы не зашли.
У себя на сайте я использовал следующий запрос:
UPDATE sys_pages
SET sys_pages.del = 'yes'
WHERE sys_pages.id_main IN (
SELECT sys_pages.id_main
FROM sys_pages LEFT JOIN groups_new
ON sys_pages.kod = groups_new.kod
WHERE (sys_pages.export='yes') and (groups_new.kod IS NULL)
)
Запрос выдает ошибку:
[Err] 1093 - You can't specify target table 'sys_pages' for update in FROM clause
Вложенный запрос самостоятельно работает без ошибок.
Конструкция внешнего запроса вроде бы корректная.
В чем я напортачил? И как исправить положение?
Помогите, плиз, написать правильный запрос!
Отредактированно igrok (03.06.2013 19:51:57)
Неактивен
Вы пытаетесь сделать выборку из обновляемой таблицы, так делать нельзя. В Вашем случае без проблем можно обойтись без подзапроса, почитайте про многотабличные апдейты.
Неактивен
Скажем так, у меня есть две таблицы с товарами: "A" и "B",
Вариант задачи 1: Из таблицы A нужно удалить товары, которых нет в таблице B.
Вариант задачи 2: В таблице A нужно отметить товары, которых нет в таблице B (отметить в графе del, задав значение "yes").
Задачу можно разбить на 2 логических действия:
1. Выбираем в таблице A те строки с товарами, которых нет в B. (товары сравниваем по графе "kod").
2. Выбранные строки удаляем (вар.1) или помечаем (вар.2)
Самый обычный способ найти строки в таблице А, которых нет в таблице B - это сделать SELECT с левосторонней связью по коду товара, отобрав строки, в которых B.kod = NULL. А затем пометить или удалить эти стоки из A.
SELECT A.id
FROM A LEFT JOIN B
ON A.kod = B.kod
WHERE B.kod IS NULL
Как далее, используя отобранные A.id, (вар.1) удалить их из таблицы A или (вар.2) пометить в графе A.del ? Как сделать это в одном запросе?
Неактивен
UPDATE a
LEFT JOIN b ON b.kod = a.kod
SET a.del = 'newvalue'
WHERE b.id IS NULL
Как-то так... запрос не тестировал, но принцип, думаю, понятен. По такой же аналогии можно удалять записи:
DELETE a
LEFT JOIN b ON b.kod = a.kod
WHERE b.id IS NULL
Неактивен
igrok написал:
Запрос выдает ошибку:
[Err] 1093 - You can't specify target table 'sys_pages' for update in FROM clause
Вложенный запрос самостоятельно работает без ошибок.
Конструкция внешнего запроса вроде бы корректная.
В чем я напортачил? И как исправить положение?
Помогите, плиз, написать правильный запрос!
Ни в чем не напортачили. Просто в MySQL есть пока ограничение, запрещающее изменять данные и одновременно делать выборку из той же таблицы.
Обойти можно используя вложенный подзапрос:
Неактивен
to Neval:
Виноват пробел в образовании
Не знал, что можно совмещать UPDATE и таблицы table1 и table2 не через запятую, а сразу с JOIN в одном простом запросе.
Большое спасибо за науку!
to vasya:
И Вам большое спасибо!
vasya написал:
...and (groups_new.kod IS NULL)
)t );
Подскажите, пожалуйста, что за t стоит в конце цитируемого кода?
Где про это "t" можно почитать?
Неактивен
Это алиас/синоним/имя таблицы, чтобы можно было как-то обращаться к её полям по t.field_name.
Неактивен
to Neval:
Я правильно понял, что алиас "t" пишется после скобок, в которых заключен запрос с выборкой?
В данном случае:
(SELECT sys_pages.id_main .........IS NULL) t
Неактивен
Да
Неактивен
Спасибо всем!
Неактивен
Ошибка 1093 давно известная, и обойти можно двумя способами.
Вот так должно работать. И выглядит на порядок понятнее чем с вложенным SELECT FROM SELECT.
Отредактированно nistelroi (19.07.2014 00:47:00)
Неактивен