我所拥有的是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个字段并访问数据库表
答案 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
使用AND
和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(?)印章的人可以帮助你
答案 1 :(得分:0)
并且,你只是无法比较说obj1和obj2和obj3不在(某些列表)中,它应该像obj1不在(somelist)而obj2不在(somelist)而obj3不在(某些列表)。< / p>
在这种情况下,最好在DB2中创建一个临时表,其中存档表是来自DB1中主表的数据。然后,运行像
这样的查询delete from archive1 where col1 not in (select col_master from temp_table);