2016-02-08 31 views
0

我使用SQLite,並試圖舊行從表學生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用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

加入不DELETE語句工作。 –

+0

@CL。是的,他們做...你可以加入,然後決定從上面刪除哪個表。 您可以找到許多參考文獻1: http://stackoverflow.com/questions/16481379/how-to-delete-using-inner-join-with-sql-server – gimbel0893

+0

不,他們不在SQLite中。 –

相關問題