【问题标题】:Oracle SQL correlated subqueryOracle SQL 相关子查询
【发布时间】:2015-06-29 10:43:31
【问题描述】:

我有以下查询来显示给定 base_objectid 的行数:

Select Count(*) 
from 
(
select di.id, di.archkey, dc.mimetype, dc.film, dc.blip, dc.originalfilename, stp.id as baseID, null as Volume, stp.path as Dateiname_org, stp.basepath as Pfad, stp.filelength as Dateilaenge
, 1 as "Dateinummer", dc.idx
from 
doc_instance di 
, doc_content dc 
, sto_hydstorageplace stp 
where 
di.baseobjectid = :base_objectid
and stp.archivekey = di.archkey 
and di.id = dc.docinstanceid (+) 
and stp.imagenr = dc.idx
union 
select di.id, di.archkey, dc.mimetype, dc.film, dc.blip, dc.originalfilename, stf.id as baseID, stf.volume as Volume, stf.filename as Dateiname_org, stol.confvalue as Pfad, stf.filesize as Dateilaenge 
, stf.fileno as "Dateinummer", dc.idx 
from 
doc_instance di 
, doc_content dc
, sto_storagefileentry stf 
, sto_storagelevelconf stc 
, sto_storagelevelconfentry stol 
where
di.baseobjectid = :base_objectid 
and stf.archkey = di.archkey 
and stf.storagelevel = stc.storagelevel
and stc.id = stol.storagelevel 
and stol.confkey = 'FILEARCHIVE' 
and di.id = dc.docinstanceid (+) 
and stf.fileno-1 = dc.idx
) temp 
order by archkey, idx

现在我想向我显示属于另一个表的所有 base_objectid 的行数,因此上述查询必须针对 base_objectid 的每个特定值执行。我假设我必须对子查询进行上述查询,但我所有的 Trials 都失败了。

【问题讨论】:

    标签: sql oracle correlated-subquery


    【解决方案1】:

    大概你只需要把select改成:

    select base_objectid, count(*)
    

    order by前添加group by

    group by base_objectid
    

    并删除任何限制输出的条件。

    但很难说。您的查询基本上难以理解,因为:

    • 您使用的是旧式join 语法。 从不from 子句中使用逗号。 总是使用明确的join 语法。
    • 更糟糕的是,您正在使用带有 (+) 的外连接,甚至 Oracle 也不再推荐了。
    • 您没有缩进来帮助其他人理解查询。

    【讨论】: