2011-09-15 8 views
2

クラスに登録されていないすべての人々を返す動作するmysqlクエリがあります。 SQLは次のとおりです。NOT INクエリの結果を削除するSQLクエリ

SELECT * FROM person 
LEFT JOIN attendance 
ON (person.id = attendance.pid) 
WHERE (attendance.pid IS NULL 
) 

ここで、その結果のすべての人物を削除します。これを行う最善の方法は何ですか?私は "SELECT *"を "DELETE"に変更しようとしましたが、これは私に構文エラーをもたらしました。何か案は?

DELETE FROM person WHERE id NOT IN (SELECT pid FROM attendance) 
+1

データベースエンジンを使用していますか? –

+0

'delete'で試してみるときに '*'を取り出したことを思い出しましたか? – Beef

+0

http://stackoverflow.com/questions/5835589/sql-2-tables-how-to-delete-rows-if-id-not-referenced-in-both-tables/5835619#5835619 –

答えて

5

にそれを変更してみてください。 PL/SQLで または多分別の、それは次のようになります。

DELETE FROM person where person.id not in(
    SELECT a.pid FROM attendance a 
) 

[テストされていません]

+0

ヘッドアップ:NULL pidが出席している場合は、これは動作しないと思います。 –

+0

@Derek、それは実装に依存します。サブセレクトにpid IS NOT NULLを追加することで対処できます。 –

+0

@Robertでは、一部のエンジンでは、サブ選択の結果にNULLが表示された場合、レコードが一致することはありません。 –

1

は、あなたが出席記録せずにすべての人を削除しようとしていると仮定すると、

DELETE person 
FROM person 
LEFT JOIN attendance 
ON (person.id = attendance.pid) 
WHERE (attendance.pid IS NULL 
) 
0

それはエンジンによって異なります。

関連する問題