2016-08-04 79 views
0

我使用的是Oracle,我有一个查询:有2子查询的问题SELECT

SELECT count(*) FROM table1; 

会抛出我作为结果21932,那么我以前设置查询作为子查询中的下一个方法:

SELECT count(*) FROM table2 WHERE attr1 IN (SELECT attr1 FROM table1); 

这会引起我的结果10489。所以,我想删除不在此组内的行,其余运行DELETE句话之前,我想检查行的这个数字是正确的,下一个查询:

SELECT count(*) FROM table1 WHERE attr1 NOT IN 
    (SELECT attr1 FROM table2 WHERE attr1 IN (SELECT attr1 FROM table1)); 

行的数目应该是11443 (total - 10489) ,但声明抛出我3743行,为什么这是结果?我怎么能得到我想要删除的行数?

在此先感谢。

回答

2

您正在计算记录的table2attr1其中存在table1。这并没有告诉我们table2中没有这种匹配的记录。可能是1分的记录,可能是一百万条记录都具有不同的attr1,可能是一百万条记录都具有相同的attr1等,所以不存在数学告诉我们您的最后一个查询应导致的。

.. 。或者你还没有告诉我们这两张表和attr1

+0

您说得对,'attr1'在这两个表 –

+0

Hm中都是唯一的,而且mathguy关于NULL的猜测也不适用? 'count(*)','count(attr1)'和'count(distinct attr1)'给每个表相同的数字? –

+0

对不起''attr1'在两个表中都不是唯一的,只在'table2'中,而不在'table1'中,我可以注意到运行这个语句'count(distinct attr1)'。 –

1

您在where子句中选择的嵌套可能是问题。为了使它更简单,我会说:

select count(*) from table1 t 
where not exists (select 1 from table2 t2 
        where t2.attr1 = t.attr1) 
+0

您的陈述抛出我结果'3743' –

1

的差异可能会告诉你一些在table1.attr1NULL,因为NULL既不是IN (...)也不NOT IN (...)

尝试:select case when attr1 is null then 1 end as count_nulls from table1 - 这会直接告诉你在table1.attr1有多少个空值。