SQL从不同数据库中的多个表中删除没有共同元素

时间:2013-04-02 18:34:38

标签: java sql db2

我所拥有的是7个表,其中一个是主列表,另外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(它们对于每一行都是唯一的,但是顶部可能有许多相同的值)。就像我说的那样,如果主表中没有相同的TOP,MIDDLE,BOTTOM,OBJECTS,那么该行可以从列出它的存档中删除。我试图将所有内容放在一个查询中,但也许我需要多个?

我的主要问题是: A)我的查询在任何意义上都是正确的吗? B)由于这些表位于2个不同的数据库中,我该如何处理?

找到解决方案:

       query = "DELETE FROM "+ tables[i] +
       " WHERE (TOP, MIDDLE, BOTTOM) NOT IN "+ 
       "(SELECT TOP, MIDDLE, BOTTOM FROM DB1.DB.masterTable)";

主要问题在于弄清楚如何一次比较每行的所有3个字段并访问数据库表

2 个答案:

答案 0 :(得分: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&lt;&gt; FROM表WHERE列operatorvalue

使用ANDORWHERE子句中列出多个列条件。

此外,ANDSELECT语句中无效。如果要组合多个结果集,请使用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(?)印章的人可以帮助你

答案 1 :(得分:0)

  1. 您需要从第一个数据库中获取要删除的数据列表。
  2. 然后在第二个数据库中删除
  3. 并且,你只是无法比较说obj1和obj2和obj3不在(某些列表)中,它应该像obj1不在(somelist)而obj2不在(somelist)而obj3不在(某些列表)。< / p>

    在这种情况下,最好在DB2中创建一个临时表,其中存档表是来自DB1中主表的数据。然后,运行像

    这样的查询
    delete from archive1 where col1 not in (select col_master from temp_table);