私が持っているのは 7 つのテーブルで、そのうちの 1 つはマスター リストで、残りの 6 つはアーカイブです。また、アーカイブは別のデータベースにあります。マスター テーブルにリストされていない 3 つの異なる列 ID (上、中、下) をチェックして、アーカイブ テーブルを調べて行を削除する必要があります。これらは関連性がなくなったためです。私のSQL文は以下です。私はまだそれをテストする方法を持っていませんが、私は SQL にあまり詳しくないので、人々がいくつかのヒントを与えてくれることを望んでいました.
String[] tables;
tables = new String[]{"archive1", "archive2", "archive3",
"archive4", "archive5", "archive6"};
String query;
Statement stmt;
String objs = "TOP AND MIDDLE AND BOTTOM";
while(i<tables.length){
//TODO: CONFIRM THE QUERY IS CORRECT
query = "DELETE FROM "+ tables[i] + " WHERE "+ objs +
"NOT IN(SELECT " + objs + " FROM DB.masterTable WHERE " +
objs + " IS NOT NULL)";
//IS NOT NULL may not be necessary
try{
//TODO: VERIFY CONNECTION IS CORRECT
stmt = this.DB2.createStatement();
stmt.executeUpdate(query);
}catch(SQLException x){
System.out.println("Failure in loop queries!");
}
i++;
}
}
テーブルには多くの列がありますが、トップ、ミドル、ボトムの ID を比較することに関心があります (これらは各行に固有ですが、たとえば、トップには同じ値が多数含まれている可能性があります)。先ほど言ったように、マスター テーブル OBJECTS に同じ TOP、MIDDLE、BOTTOM を持つ行がない場合、その行はそれがリストされているアーカイブから削除できます。すべてを 1 つのクエリにまとめようとしましたが、複数のクエリが必要になるのでしょうか?
私の主な質問は次のとおりです。 A) 私のクエリは何らかの意味で正しいですか? B) テーブルは 2 つの異なるデータベース上にあるため、どのように処理すればよいですか?
見つかった解決策:
query = "DELETE FROM "+ tables[i] +
" WHERE (TOP, MIDDLE, BOTTOM) NOT IN "+
"(SELECT TOP, MIDDLE, BOTTOM FROM DB1.DB.masterTable)";
主な問題は、一度に各行の 3 つのフィールドすべてを比較し、DB テーブルにアクセスする方法を理解することになりました