问题描述
||
例如,假设我有一个包含列的表:
item_id opp date
该表是在特定日期对items_id和应用到它们的操作的存档。
我想查询表格并计算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。
解决方法
您可以使用相关的子查询来验证另一行是否具有不同的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。
, 并不是特别聪明,但是我认为您可以使用如下所示的自联接来做到这一点:
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\'
, 您可以使用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,d) values (\'AB\',\'BOO\',d) values (\'AC\',\'300\');
insert into gregws (item_id,d) values (\'AD\',\'MOO\',d) values (\'AE\',\'ZOO\',\'200\');
select distinct * from gregws
start with opp=\'FOO\'
connect by nocycle prior d = d and prior opp != opp;
, 我认为这将为您提供所需的信息:对给定日期的item_ID的OPP均为\“ FOO \”和\“ BAZ \”的唯一item_ID的数量进行计数。
SELECT COUNT(DISTINCT item_id)
FROM table_name
WHERE opp IN (\'FOO\',\'BAZ\') AND date = \'01012011\'
HAVING COUNT(DISTINCT opp) = 2