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

问题描述

|| 例如,假设我有一个包含列的表:
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
    

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...