0

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

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

找到的解决方案:

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

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

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 table WHERE 列操作符值

使用ANDandOR在您的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 回答
0
  1. 您需要从第一个数据库中获取要删除的数据列表。
  2. 然后在第二个数据库中删除

而且,你不能比较说 obj1 和 obj2 和 obj3 不在(某些列表)中,它应该像 obj1 不在(somelist)中和 obj2 不在(somelist)中并且 obj3 不在(无论如何)。

在这种情况下,最好在归档表所在的 DB2 中创建一个临时表,其中包含 DB1 中主表中的数据。然后,运行查询

delete from archive1 where col1 not in (select col_master from temp_table);
于 2013-04-02T18:42:33.533 回答