Oracle - SQL - Tricky Query寻找更好的解决方案

时间:2011-06-15 14:02:02

标签: sql oracle

例如,假设我有一个包含列的表:

item_id opp date

此表是在特定日期应用于它们的items_ids和操作的存档。 我想查询表并计算OPP为'FOO'的项目数量,这些项目在日期内也有OPP'BAZ'的条目。

count(rowid) from table_name where OPP='FOO' and date='01012011'

此查询将为我提供第一部分,是否有一种智能方法可以链接两者而无需以一般形式执行另一个内联选择:

 count(rowid) from table_name 
 where OPP='FOO' 
 and date='01012011' 
 and item_id in (
    select item_id from table_name where date='01012011'
 )

该平台是Oracle 10G,我正在使用Toad进行开发,但希望能够获取sql代码并通过Perl DBI运行,所以常规sql,而不是pl / sql。

4 个答案:

答案 0 :(得分:1)

您可以使用相关子查询验证另一行是否存在具有不同OPP值的行,如下例所示(假设想要第二行具有不同的状态 - 可以轻松更改以查找状态BAZ。

select count(rowid)
  from table_name outr
 where OPP='FOO' 
   and date='01012011' 
   and exists (select null
                 from table_name innr
                where innr.OPP = 'BAZ'
                  and innr.date = outr.date)

这是完全有效的SQL,而不是PL / SQL。

答案 1 :(得分:0)

不是特别聪明,但我认为你可以使用这样的自联接来实现:

select a.date,count(*)
from table_name a, table_name b
where a.date = '01012011'
and a.date = b.date
and a.OPP = 'FOO'
and b.OPP <> 'FOO'

答案 2 :(得分:0)

您可以使用CONNECT BY PRIOR(http://psoug.org/reference/connectby.html更多信息)

一个小例子(d是我的日期栏)。当然,您可以对查询进行计数,但我发现在没有计数的情况下更容易验证您想要的内容。

create table gregws(
  item_id varchar2(200),
  opp varchar2(200),
  d varchar2(200)
);

insert into gregws (item_id,opp,d) values ('AA','FOO','100');
insert into gregws (item_id,opp,d) values ('AB','BOO','100');
insert into gregws (item_id,opp,d) values ('AC','FOO','300');
insert into gregws (item_id,opp,d) values ('AD','MOO','300');
insert into gregws (item_id,opp,d) values ('AE','ZOO','200');


select distinct * from gregws
start with opp='FOO'
connect by nocycle prior d = d and prior opp != opp;

答案 3 :(得分:0)

我认为这会给你你想要的东西:对于给定日期,item_ID具有“FOO”和“BAZ”的OPP的唯一item_ID的数量的计数。

SELECT   COUNT(DISTINCT item_id)
  FROM   table_name
 WHERE   opp IN ('FOO', 'BAZ') AND date = '01012011'
HAVING   COUNT(DISTINCT opp) = 2