我对MySQL和MSSQL有更多的经验,但我不认为自己是SQL专家。
我需要在Oracle数据库上运行一些SQL工作。甚至还不确定版本,但它应该是最近的(10,11??)。
无论如何,我必须计算跨越两个表的不同记录的数量。为了便于讨论,我们称它们为master和detail。
下面的SQL根据数据给出了我想要的数字。但是,此SQL最终将放入UDF (或Oracle等效物)中。但我的问题是,有没有更好的方法?或者使用一些高级的Oracle优化,或者只是使用更好的SQL查询。
谢谢
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
);数据:
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发布于 2012-11-08 05:47:44
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'或
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'
)发布于 2012-11-08 10:51:28
如果您使用
COUNT(DISTINCT mas.barcode || det.barcode_val) 确保在管道之间放置分隔符:
COUNT(DISTINCT mas.barcode || '-' || det.barcode_val) 例如,想象一下下面的场景:
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个不同的值。但如果您尝试使用
COUNT(DISTINCT COLUMN1 || COLUMN2)你只会得到两个“不同”的组。这只是一个小贴士,让你尽量避免那些角落的案例。
https://stackoverflow.com/questions/13278670
复制相似问题