#mysql #sql-delete #natural-join
#mysql #sql-удалить #естественное соединение
Вопрос:
В MySQL у меня есть две таблицы (курс и раздел), и я хочу удалить все разделы, которые составляют 1 кредит и по понедельникам. В таблице курса указаны кредиты для курса, а в таблице разделов указаны дни для этого раздела курса. Вот что у меня есть для моего запроса, но я получаю ошибки:
DELETE FROM
section
WHERE
course_ID
IN (
SELECT course_ID
FROM course
NATURAL JOIN section
WHERE credits = '1'
AND days LIKE '%M%'
);
Кто-нибудь может помочь с этим?
Комментарии:
1. что значит «но я получаю ошибки:» ? покажите нам точное сообщение об ошибке ..
2. Каковы фактические столбцы, которые являются общими для обеих таблиц?
Ответ №1:
Вероятно, вам не нужно повторно section
открывать подзапрос. Я подозреваю, что вы могли бы сформулировать запрос как:
delete s
from section s
natural join course c
where c.credit = 1 and c.days like '%M%'
Я не большой поклонник natural join
s, потому что в нем не указана логика объединения (и зависит от совпадающих имен столбцов, а не от фактических зависимостей схемы, таких как внешние ключи). Я бы рекомендовал переключиться на обычное соединение, возможно, используя using()
предложение.
Если в course
этом совпадении может быть несколько строк для заданного section
a , то exists
это более уместно , чем a join
. Предполагая, что этот столбец section_id
можно использовать для связи двух таблиц, вы бы сделали:
delete s
from section s
where exists (
select 1
from course c
where c.credit = 1 and c.days like '%M%' and c.section_id = s.section_id
)
Комментарии:
1. Я использовал ваше второе решение, но я получаю «0 затронутых строк», где должно быть много строк, которые следует удалить.
2. @greenguy: возможно, вам потребуется проверить условие корреляции между двумя таблицами. Я предположил
section_id
, но это всего лишь предположение.3. Мне нужно использовать естественное соединение, поэтому я попытаюсь основать его на операторе естественного соединения.
Ответ №2:
не могли бы вы иметь такое же исключение таблицы для раздела таблицы
чтобы избежать этого, вы могли бы попробовать использовать соединение в подзапросе вместо предложения IN
DELETE s
FROM section s
INNER JOIN (
SELECT course_ID
FROM course
NATURAL JOIN section
WHERE credits = '1'
AND days LIKE '%M%'
) t on t.course_ID = s.course_ID