在Oracle中使用count作为条件

时间:2012-01-27 17:08:27

标签: sql oracle count conditional

我有两个问题,q1q2。我想在q1没有行的情况下从q2返回列。例如:

select a, b, c from t1 where
count(select d, e, f from t2 where ...) == 0
and ...

通常情况下,我只会使用JOIN,但在这种情况下,我没有相关的密钥。

在Oracle中执行此操作的最佳方法是什么?

6 个答案:

答案 0 :(得分:1)

我认为这些查询完全独立,如下:

create table table_q1 (
  id  number,
  txt varchar2(10)
);

insert into table_q1 values ( 1, 'This');
insert into table_q1 values ( 2, 'data');
insert into table_q1 values ( 3, 'only');
insert into table_q1 values ( 4, 'selected');
insert into table_q1 values ( 5, 'if');
insert into table_q1 values ( 6, 'other');
insert into table_q1 values ( 7, 'query''s');
insert into table_q1 values ( 8, 'count');
insert into table_q1 values ( 9, 'greater');
insert into table_q1 values (10, 'zero');

create table table_q2 (
  id  number
);

insert into table_q2 values (1);
insert into table_q2 values (2);
insert into table_q2 values (3);
insert into table_q2 values (4);

现在,您可以使用一个查询q2来选择table_q2的计数,并将其与条件table_q1交叉连接到q2.cnt = 0,这样q1只会选择记录,如果q2的计数是!= 0。

以下select语句不返回任何记录:

with q2 as (select count(*) cnt from table_q2 where id > 2)
select q1.* from table_q1 q1, q2
where q2.cnt = 0
order by q1.id;

但是这个确实:

with q2 as (select count(*) cnt from table_q2 where id > 1000)
select q1.* from table_q1 q1, q2
where q2.cnt = 0
order by q1.id;

答案 1 :(得分:1)

select <columns> 
  from table 
 where not exists (select <columns> 
                     from table2 
                     where ....) 

应该有效。如果内部查询和外部查询之间存在某种关系,则只需向表达该关系的NOT EXISTS子查询添加一个附加谓词(即table.column_name = table2.column_name)。但是没有必要使子查询相关。

您也不需要在子查询的SELECT列表中指定列名。只有添加列才会改变查询计划(例如,通过强制优化器查询表而不是使用覆盖索引)。如果你使用这样的东西,你会得到相同的结果,它可能会稍快一些。

select <columns> 
  from table 
 where not exists (select 1 
                     from table2 
                     where ....) 

答案 2 :(得分:1)

也许你可以试试这样的东西


SELECT *
  FROM TABLE1
 WHERE DECODE((SELECT COUNT(T2.SOME_COLUMN)
                FROM TABLE2 T2
               WHERE T2.CONDITION_COLUMN = 'SOM_VAL'),
              0,
              'FALSE',
              'TRUE') = 'TRUE'

此处

DECODE
中的嵌套查询将计算某列的编号。如果它是ZERO,它将返回false并且查询将不返回任何内容或者如果它返回任何超过ZERO的值,它将返回TRUE并且查询将返回值。

希望有所帮助

答案 3 :(得分:0)

  1. 编写包含COUNT和GROUP BY的查询,而不尝试过滤掉COUNT(x)= 0.您应该在结果集中看到零。你要消除。

  2. 添加HAVING子句:HAVING COUNT(x)&lt;&gt; 0

答案 4 :(得分:0)

如果这些表实际上是在某个字段上连接的(我们将它们命名为id),那么值得构建一个像

这样的查询
SELECT ... FROM table WHERE id NOT IN (SELECT id FROM table2 WHERE ...)

答案 5 :(得分:-1)

检查此查询

<强>测试

select * from table1 where (SELECT count() FROM table2)=0