我有两个问题,q1
和q2
。我想在q1
没有行的情况下从q2
返回列。例如:
select a, b, c from t1 where
count(select d, e, f from t2 where ...) == 0
and ...
通常情况下,我只会使用JOIN
,但在这种情况下,我没有相关的密钥。
在Oracle中执行此操作的最佳方法是什么?
答案 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)
编写包含COUNT和GROUP BY的查询,而不尝试过滤掉COUNT(x)= 0.您应该在结果集中看到零。你要消除。
添加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