Как удалить неиспользуемые строки из таблицы БД с помощью SQL?

Я пытаюсь удалить неиспользуемые строки из таблицы. Это упрощенный пример моей проблемы:

есть 2 таблицы:

user table:

user_id    user_name
--------------------
1          Mike
3          Carol
8          Eric


address table:

user_id    address
-----------------------
1          mike@abc.com        
3          carol@yyy.com
10         bob@example.com
3          carol@example.com

Я хочу удалить ненужные адреса из адресной таблицы. Если user_id адреса существует в пользовательской таблице, то адрес не используется. В таблице примеров есть один неиспользуемый адрес: bob@example.com.

Я новичок в SQL, и мое решение было отвратительное:

DELETE FROM address 
  WHERE NOT EXISTS 
   ( SELECT * FROM user WHERE address.user_id = user.user_id );

там должен быть лучший способ сделать он. Как лучше всего это сделать?

SQLite является.

2 ответов


делай так:

DELETE FROM address
    WHERE user_id NOT IN (SELECT user_id FROM user);

в вашем случае, вы должны рассмотреть вопрос о создании user_id как первичный ключ в user и как внешний ключ в address. Таким образом, если вы удалите одного из своих пользователей в user, вы можете установить ON DELETE CASCADE возможность автоматического удаления связанных строк в адресе.

во время создания вашей таблицы вам нужно только сделать что-то вроде этого :

CREATE TABLE user (
  user_id INTEGER,
  user_name VARCHAR(30),
  PRIMARY KEY (user_id)
);

CREATE TABLE address (
  user_id INTEGER,
  address VARCHAR(30),
  PRIMARY KEY (user_id, address),
  FOREIGN KEY (user_id) REFERENCES user(user_id)
    ON DELETE CASCADE
);

в основном, каждый пользователь имеет уникальный user_id. Если вы удалите одного из этих пользователей, соответствующие адреса в address также будет удален, так как user.user_id address.user_id "точки" был удален.

если вы хотите удалить только эти неиспользуемые адреса, ваше решение должно работать нормально.