У меня есть простая таблица MySQL:
CREATE TABLE IF NOT EXISTS `pers` (
`persID` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(35) NOT NULL,
`gehalt` int(11) NOT NULL,
`chefID` int(11) DEFAULT NULL,
PRIMARY KEY (`persID`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ;
INSERT INTO `pers` (`persID`, `name`, `gehalt`, `chefID`) VALUES
(1, 'blb', 1000, 3),
(2, 'as', 1000, 3),
(3, 'chef', 1040, NULL);
Я попытался запустить следующее обновление, но я получаю только ошибку 1093:
UPDATE pers P
SET P.gehalt = P.gehalt * 1.05
WHERE (P.chefID IS NOT NULL
OR gehalt <
(SELECT (
SELECT MAX(gehalt * 1.05)
FROM pers MA
WHERE MA.chefID = MA.chefID)
AS _pers
))
Я искал ошибку и обнаружил в mysql следующую страницу http://dev.mysql.com/doc/refman/5.1/en/subquery-restrictions.html , но она мне не помогает.
Что я должен сделать, чтобы исправить запрос sql?
sql
mysql
mysql-error-1093
CSchulz
источник
источник
Ответы:
Проблема в том, что MySQL, по какой-то неоправданной причине, не позволяет вам писать такие запросы:
То есть, если вы делаете
UPDATE
/INSERT
/DELETE
для таблицы, вы не можете ссылаться на эту таблицу во внутреннем запросе ( однако вы можете ссылаться на поле из этой внешней таблицы ...)Решение состоит в том, чтобы заменить экземпляр
myTable
в подзапросе(SELECT * FROM myTable)
, как этоЭто, очевидно, приводит к тому, что необходимые поля неявно копируются во временную таблицу, поэтому это разрешено.
Я нашел это решение здесь . Примечание из этой статьи:
источник
T
и(SELECT * FROM T)
полностью эквивалентны. Это одинаковые отношения. Поэтому это произвольное, бессмысленное ограничение. Более конкретно, это обходной путь, чтобы заставить MySQL сделать что-то, что он может делать, но по какой-то причине он не может разобрать в своей более простой форме.DELETE FROM t WHERE tableID NOT IN (SELECT viewID FROM t_view);
Также я рекомендую запуститьOPTIMIZE TABLE t;
потом, чтобы уменьшить размер таблицы.Вы можете сделать это в три этапа:
...
или
источник
CREATE TABLE
утверждениями - я надеюсь, что автору было известно об этом. Однако это единственное решение? Или запрос может быть переписан с помощью подзапросов или объединений? И почему (не) это сделать?UPDATE Pers P
читатьUPDATE pers P
?CREATE TABLE AS SELECT
ужасного представления не дает?В Mysql вы не можете обновить одну таблицу, выполнив подзапрос этой же таблицы.
Вы можете разделить запрос на две части или сделать
источник
SELECT ... SET
? Я никогда не слышал об этом.AS B
во второй ссылке наTABLE_A
. ответ в примере с наибольшим количеством голосов можно упростить, используяAS T
вместо потенциально неэффективногоFROM (SELECT * FROM myTable) AS something
, который, к счастью, оптимизатор запросов обычно устраняет, но не всегда делает это.Создать временную таблицу (tempP) из подзапроса
Я ввел отдельное имя (псевдоним) и присвоил новое имя столбцу «persID» для временной таблицы.
источник
SELECT ( SELECT MAX(gehalt * 1.05)..
- первыйSELECT
не выбирает ни одного столбца.Это довольно просто. Например, вместо того, чтобы писать:
ты должен написать
или похожие.
источник
Подход, опубликованный BlueRaja, медленный, я изменил его, так как использовал для удаления дубликатов из таблицы. В случае, если это помогает кому-либо с большими столами Original Query
Это занимает больше времени:
Более быстрое решение
источник
Для справки, вы также можете использовать переменные Mysql для сохранения временных результатов, например:
https://dev.mysql.com/doc/refman/5.7/en/user-variables.html
источник
Если вы пытаетесь прочитать fieldA из tableA и сохранить его в fieldB в той же таблице, когда fieldc = fieldd, вы можете подумать об этом.
Код выше копирует значение из fieldA в fieldB, когда условие-поле удовлетворяет вашему условию. это также работает в ADO (например, доступ)
Источник: попробовал сам
источник
MariaDB поднял это, начиная с 10.3.x (и для
DELETE
иUPDATE
):DBFiddle MariaDB 10.2 - ошибка
DBFiddle MariaDB 10.3 - Успех
источник
Другие обходные пути включают использование SELECT DISTINCT или LIMIT в подзапросе, хотя они не так явно влияют на материализацию. это сработало для меня
как упоминалось в MySql Doc
источник
MySQL не позволяет выбирать из таблицы и обновлять в одной и той же таблице одновременно. Но всегда есть обходной путь :)
Это не работает >>>>
Но это работает >>>>
источник