0

私が持っているのは 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 テーブルにアクセスする方法を理解することになりました

4

2 に答える 2

1

A) いいえ。クエリにいくつかの根本的なエラーがあります。クエリを展開すると、どこでobjs = "OBJ_ID_TOP AND OBJ_ID_MIDDLE AND OBJ_ID_BOTTOM"

query = "DELETE FROM "+ tables[i] 
        + " WHERE OBJ_ID_TOP AND OBJ_ID_MIDDLE AND OBJ_ID_BOTTOM 
              NOT IN(SELECT OBJ_ID_TOP AND OBJ_ID_MIDDLE AND OBJ_ID_BOTTOM 
                     FROM db1Connection.OBJECTS 
                     WHERE OBJ_ID_TOP AND OBJ_ID_MIDDLE AND OBJ_ID_BOTTOM IS NOT NULL)";

これは適切な SQL ではありません... WHERE句に関する wiki ページを一瞥すると、

SQL Where 句を記述するための適切な構文は次のとおりです。

SELECT <> FROM テーブル WHERE 列 演算子値

ANDandを使用して、句ORで複数の列条件を並べます。WHERE

また、ステートメントANDでは無効です。SELECT複数の結果セットを組み合わせる場合は、UNIONを使用します。


フォームの何か (以下を参照) は、必要なものに近いものです。(注:決して最適化されていません...単なるデモンストレーションです)

編集私はもともとあなたがやろうとしていることを誤解していたと思います...しかし、あなたはから削除したいと思いsome_tableますmaster_table

--DELETE --can swap out SELECT for DELETE when the selected results look right
SELECT s.* 
FROM some_table s  --this is table[i]
  LEFT OUTER JOIN master_table mt   --db1Connection.OBJECTS
     on s.ID_TOP = mt.ID_TOP
        AND s.ID_MIDDLE = mt.ID_MIDDLE
        AND s.ID_BOTTOM = mt.ID_BOTTOM
WHERE mt.ID_TOP IS NULL
        AND mt.ID_MIDDLE IS NULL
        AND mt.ID_BOTTOM IS NULL

B) この質問にはお答えできません... DB2(?) に詳しい人が助けてくれます

于 2013-04-02T19:51:56.677 に答える