Удаление MySQL на основе двух таблиц

#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