SQL для запроса на удаление - PullRequest
2 голосов
/ 15 января 2010

Я пытаюсь написать запрос SQL для своей программы, но я просто не могу понять, как. Я не знаю достаточно SQL.

Я пытаюсь внедрить онлайн систему команд (для какого-то сайта). У меня есть две таблицы:

teams | teamId, eventId
teammembers | teamId, userId, status

Теперь мне нужно: удалить все записи в teammembers, где идентификатор события для соответствующего teamId равен 1.

Я пытаюсь:

delete from teammembers where teamId=teams.teamId and teams.eventId=1;

Я не уверен, действительно ли это делает то, что я пытаюсь сделать.

Является ли этот запрос неправильным, и если он (который, вероятно, есть), как мне написать такой запрос?

Ответы [ 6 ]

12 голосов
/ 15 января 2010

Вы не указываете свою СУБД, поэтому здесь она находится в MySQL

DELETE teammembers FROM teammembers
JOIN teams on teammembers.teamId = teams.teamId
WHERE teams.eventId = 1
6 голосов
/ 15 января 2010

Это то, что я бы сделал в SQL Server

DELETE tm 
--select tm.*
FROM teammembers tm
JOIN teams t on tm.teamId = t.teamId 
WHERE t.eventId = 1 

Внедрив выбор в комментарии, я могу запустить только эту часть вручную и посмотреть, на какие записи я буду влиять, прежде чем запускать удаление во время разработки.

select tm.*
FROM teammembers tm
JOIN teams t on tm.teamId = t.teamId 
WHERE t.eventId = 1 

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

4 голосов
/ 15 января 2010

Вам нужно выполнить подзапрос или объединение, я думаю, что объединение происходит быстрее.

delete from teammembers
join teams on teammembers.teamid = teams.teamid
where teams.eventid = 1
3 голосов
/ 15 января 2010

Вам необходимо использовать синтаксис удаления нескольких таблиц :

DELETE teammembers
FROM teammembers
JOIN teams ON teamId=teams.teamId 
WHERE teams.eventId=1;

(я предполагаю, что MySQL здесь)

1 голос
/ 15 января 2010
delete from teammembers where teamid in 
(
  select teamid from teams where eventid = 1
)

Предполагая, что teamid является столбцом присоединения.

0 голосов
/ 15 января 2010

Это то, что вы хотите:

delete from teammembers where teamId in (select teamId from teams where eventId=1);

Редактировать: Как уже отмечалось в некоторых комментариях, более эффективный путь - это объединение:

delete from teammebers
join teams on teams.teamId = teammembers.teamId
where eventId = 1
...