Таблица обновления SQL, где отношение находится внутри другой таблицы

привет, у меня есть две таблицы, где таблица номер один предназначена для продукта, а таблица два - это категория, которую я хочу обновить с помощью этого SQL, но продолжаю получать синтаксическую ошибку

UPDATE product SET local_delivery = 0,none_local_delivery = 0,
WHERE EXISTS
(SELECT product.local_delivery,product.none_local_delivery 
FROM product
INNER JOIN product_to_category ON product.product_id = 
product_to_category.product_id WHERE
product_to_category.category_id = 90 )

1064 - У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, для правильного синтаксиса для использования рядом с «ГДЕ СУЩЕСТВУЕТ» ( ВЫБРАТЬ продукт.local_delivery, product.none' в строке 4

Перед WHERE слишком много запятых.

Thorsten Kettner 09.05.2022 07:56

удалена запятая (1093 - вы не можете указать целевую таблицу «продукт» для обновления в предложении FROM)

Mehdi Gh 09.05.2022 07:57

Хорошо, синтаксическая ошибка исправлена. Однако мне интересно, делает ли оператор обновления то, что вы хотите. Если в таблице есть товар с категорией 90, вы обновите все строки. Если нет, вы не будете обновлять строки.

Thorsten Kettner 09.05.2022 07:59

Нет, нужно обновить список товаров, где идентификатор категории равен 90 @ThorstenKettner

Mehdi Gh 09.05.2022 08:07

Вы используете MySQL или SQL Server?

Squirrel 09.05.2022 08:09

Я удалил тег SQL Server. Оба сообщения об ошибках указывают, что вы используете MySQL, а не SQL Server. Ошибка 1093 обсуждается здесь: stackoverflow.com/questions/44970574/…, но в вашем случае вам все равно не следует присоединяться к таблице продуктов в подзапросе.

Thorsten Kettner 09.05.2022 08:17
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
6
41
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

используйте следующий синтаксис

UPDATE p
SET    local_delivery = 0,
       none_local_delivery = 0
FROM   product AS p
WHERE  EXISTS (SELECT  1
               FROM   product P
                      INNER JOIN product_to_category PCT
                              ON P.product_id =
                                 PCT.product_id
               WHERE  PCT.category_id = 90);  

Или следуйте синтаксису и удалите where exist

UPDATE p
SET    local_delivery = 0,
       none_local_delivery = 0
FROM   product p
       INNER JOIN product_to_category PTC
               ON P.product_id = PTC.product_id
WHERE  product_to_category.category_id = 90  

Бессмысленный выбор любых столбцов в EXISTS

Caius Jard 09.05.2022 08:00

Причина, по которой его «бессмысленно», заключается в том, что EXIST не возвращает столбцы, а не «True», когда в подзапросе выполняются требования предложения «Where».

Demeteor 09.05.2022 08:22

Спасибо за упоминание. Я исправил это.

RF1991 09.05.2022 16:03
Ответ принят как подходящий

Синтаксическая ошибка — это запятая прямо перед WHERE.

Затем ваш оператор обновления обновляет либо все строки таблицы, либо ни одной, в зависимости от того, существует ли продукт для категории 90.

Я предполагаю, что вместо этого вы хотите обновить все продукты категории 90. Для этого свяжите product_to_category с продуктом, который вы обновляете. Если мое предположение верно, запрос должен выглядеть так:

UPDATE product SET local_delivery = 0,none_local_delivery = 0
WHERE EXISTS
(
  SELECT NULL
  FROM product_to_category 
  WHERE product_to_category.product_id = product.product_id
  AND product_to_category.category_id = 90
);

Или немного проще с IN:

UPDATE product SET local_delivery = 0,none_local_delivery = 0
WHERE product_id IN 
        (SELECT product_id FROM product_to_category WHERE category_id = 90);

я использовал немного проще с IN, и это сработало, большое спасибо

Mehdi Gh 09.05.2022 08:18

Другие вопросы по теме