首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否有更有效的方法来计算Oracle SQL中的聚合记录数?

是否有更有效的方法来计算Oracle SQL中的聚合记录数?
EN

Stack Overflow用户
提问于 2012-11-08 05:36:47
回答 2查看 275关注 0票数 0

我对MySQL和MSSQL有更多的经验,但我不认为自己是SQL专家。

我需要在Oracle数据库上运行一些SQL工作。甚至还不确定版本,但它应该是最近的(10,11??)。

无论如何,我必须计算跨越两个表的不同记录的数量。为了便于讨论,我们称它们为masterdetail

下面的SQL根据数据给出了我想要的数字。但是,此SQL最终将放入UDF (或Oracle等效物)中。但我的问题是,有没有更好的方法?或者使用一些高级的Oracle优化,或者只是使用更好的SQL查询。

谢谢

代码语言:javascript
复制
select count(*) from
(
  select 
    mas.barcode
  , det.barcode_val

  from mas 
    inner join det on (det.trans_id = mas.trans_id and mas.trans_sub_id = det.trans_sub_id)
  where 
    mas.trans_id = 12345
    and det.code_type = 'COMMODORE'
  group by
    mas.barcode
  , det.barcode_val
);

数据:

代码语言:javascript
复制
MAS

trans_id     trans_sub_id     barcode
-------------------------------------
12345                   1      COM_A
12345                   2      COM_A
12345                   3      COM_B


DET

trans_id     trans_sub_id     code_type     barcode_val
-------------------------------------------------------
12345                   1     COMMODORE     C64
12345                   1     COMMODORE     C64
12345                   1     TANDY         TRASH80
12345                   2     COMMODORE     C128
12345                   2     ATARI         800XL
12345                   2     COMMODORE     AMIGA500
12345                   3     COMMODORE     C64


Results before count
--------------------
COM_A     C64
COM_A     C128
COM_A     AMIGA500
COM_B     C64


Results after count
-------------------
4
EN

回答 2

Stack Overflow用户

发布于 2012-11-08 05:47:44

代码语言:javascript
复制
SELECT 
COUNT(DISTINCT mas.barcode || det.barcode_val)
FROM mas 
INNER JOIN det 
ON (det.trans_id = mas.trans_id and mas.trans_sub_id = det.trans_sub_id)
WHERE 
mas.trans_id = 12345
AND det.code_type = 'COMMODORE'

代码语言:javascript
复制
SELECT COUNT(*) FROM ( 
  SELECT DISTINCT mas.barcode, det.barcode_val
  FROM mas 
  INNER JOIN det 
  ON (det.trans_id = mas.trans_id and mas.trans_sub_id = det.trans_sub_id)
  WHERE 
  mas.trans_id = 12345
  AND det.code_type = 'COMMODORE'
)
票数 1
EN

Stack Overflow用户

发布于 2012-11-08 10:51:28

如果您使用

代码语言:javascript
复制
    COUNT(DISTINCT mas.barcode || det.barcode_val)   

确保在管道之间放置分隔符:

代码语言:javascript
复制
    COUNT(DISTINCT mas.barcode || '-' || det.barcode_val)   

例如,想象一下下面的场景:

代码语言:javascript
复制
    Column1    Column2   Column1 || Column2   Column1 || '-' || Column2
    A          B         AB                   A-B
    AB        <null>     AB                   AB-
    1          201       1201                 1-201
    <null>     1201      1201                 -1201

此表有4行,其中包含4个不同的值。但如果您尝试使用

代码语言:javascript
复制
    COUNT(DISTINCT COLUMN1 || COLUMN2)

你只会得到两个“不同”的组。这只是一个小贴士,让你尽量避免那些角落的案例。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13278670

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档