2016-02-08 5 views
0

Я использую SQLite и пытаюсь переместить старые строки из таблицы Students to Students_Old и скопировать новые строки из Students_Import.Удаление строк, не существующих в другой таблице с составным первичным ключом

Проблема, у меня есть несколько первичных ключей, как это:

CREATE TABLE "Students" (
`LastName` TEXT NOT NULL, 
`FirstName` TEXT NOT NULL, 
`BornDate` TEXT NOT NULL, 
`Class` TEXT NOT NULL, 
`Photo` TEXT, 
`ValidUntil` CHAR(10), 
PRIMARY KEY(LastName,FirstName,BornDate)) 

Все таблицы имеют такую ​​структуру (за исключением Students_Import Недостающий Фото и ValidUntil).

До сих пор мне удалось скопировать старые строки с этим:

INSERT INTO Students_Old 
SELECT DISTINCT a.LastName, a.FirstName, a.BornDate, a.Class, a.Photo, a.ValidUntil FROM 
Students a LEFT JOIN Students_Import b ON a.LastName =b.LastName AND a.FirstName=b.FirstName AND a.BornDate=b.BornDate WHERE b.LastName is NULL; 

и добавить новые строки с этим:

INSERT INTO Students 
SELECT DISTINCT a.LastName, a.FirstName, a.BornDate, a.Class, "", "" FROM 
Students_Import a LEFT JOIN Students b ON a.LastName =b.LastName AND a.FirstName=b.FirstName AND a.BornDate=b.BornDate WHERE b.LastName is NULL 

Но я не могу понять, как удалить старые строки в Студентах (которые не существуют в Students_Import).

Я попробовал несколько вариантов этого:

DELETE FROM Students WHERE (LastName, FirstName, BornDate) IN 
(SELECT DISTINCT a.LastName, a.FirstName, a.BornDate, a.Class, a.Photo, a.ValidUntil FROM 
Students a LEFT JOIN Students_Import b ON a.LastName =b.LastName AND a.FirstName=b.FirstName AND a.BornDate=b.BornDate WHERE b.LastName is NULL); 

Но я только получаю синтаксическую ошибку или что я не могу использовать его на несколько строк.

Буду признателен за любую помощь!

ответ

0

В не работает с несколькими столбцами.

Чтобы найти строки, которые не существуют в другой таблице, используйте NOT EXISTS с correlated subquery:

DELETE FROM Students 
WHERE NOT EXISTS (SELECT 1 
        FROM Students_Import 
        WHERE Students_Import.LastName = Students.LastName 
        AND Students_Import.FirstName = Students.FirstName 
        AND Students_Import.BornDate = Students.BornDate); 
+0

Работает как очарование! Вы спасли мне головную боль в другой день (слишком долгое время с тех пор, как я программировал SQL, более 10 лет). Очень понравилось, спасибо! –

-1

Я не думаю, что вы можете иметь несколько столбцов в разделе IN.

Как насчет: DELETE Students FROM Students s LEFT JOIN Students_Import si ON (s.LastName = si.LastName AND s.FirstName = si.FirstName AND s.BornDate = si.BornDate) WHERE s.LastName IS NULL;

+0

Присоединяется не работают в ВЕЬЕТЕ. –

+0

@CL. Да, они ... вы можете присоединиться, а затем решить, какую таблицу удалить, как указано выше. 1 из многих ссылок вы можете найти: http://stackoverflow.com/questions/16481379/how-to-delete-using-inner-join-with-sql-server – gimbel0893

+0

Нет, они не работают в SQLite. –