计算重复字段连接的结果
Posted
技术标签:
【中文标题】计算重复字段连接的结果【英文标题】:Counting results of join on duplicate field 【发布时间】:2012-10-26 07:21:12 【问题描述】:我有一个包含重复列值的 table1
表1
id code
1 201202 0000 1111
2 201202 0000 9999
3 201203 0000 9999
4 201203 0000 0999
5 201204 1000 1999
6 201204 2000 2999
7 201205 3000 3999
8 201205 4000 4999
9 201205 5000 5999
表 2
id numbers
1 2012020010
2 2012024929
3 2012033838
4 2012052434
5 2012052229
6 2012052232
我想计算表 2 中作为表 1 中不同代码子串的所有数字 即结果应该是
code frequency
201202 2
201203 1
201205 3
我已经能够得到每个代码的所有数字,但不知道如何计算它们
SELECT DISTINCT table1.code , table1.id, table2.number AS ph_npa, count( * )
FROM table1
INNER JOIN table2 ON substr( table2.number, 1, 6 ) = table1.code
GROUP BY table1.number
感谢任何帮助。
【问题讨论】:
【参考方案1】:我并不是真正使用“内连接”语法的人,我更喜欢在数据上使用看起来更简洁的隐式连接。
select
count(*)
from
npanxxsmall n, phone_numbers p
where
substr(n.code, 1, 6) = substr(p.number, 1, 6);
让我知道这是否有效!
【讨论】:
结果和上面robin的解一样,返回的结果是table1中代码的频率 你是对的,我已经修改它只给出计数而不是频率。【参考方案2】:好的,我得到它的工作,查询超级快
选择
DISTINCT A.code as code, B.计数AS频率 FROM table1 AS A
内连接(
SELECT substr(number, 1, 6) AS subnumber, count(1) AS Counts 从表 2 GROUP BY substr(数字, 1, 6) ) AS B ON A.code = B.subnumber
即 从表2中选择数量和频率 然后加入不同的代码形式表1
【讨论】:
【参考方案3】:试试下面的。它可能会对大型数据集产生性能影响,但可以帮助您入门。它正在处理我的测试数据。
SELECT SUBSTR(t2.numbers, 1,6) AS CODE, COUNT(*) AS frequency
FROM table_2 t2
WHERE SUBSTR(t2.numbers, 1,6) IN (SELECT t1.code FROM table_1 t1)
GROUP BY SUBSTR(t2.numbers, 1,6)
让我知道它是否有效!
【讨论】:
【参考方案4】:SELECT t1.code, COUNT(*) AS frequency
FROM table_one AS t1
LEFT JOIN table_two AS t2
ON t2.numbers LIKE CONCAT(t1.code, '%')
GROUP BY t1.code
使用LEFT JOIN
或INNER JOIN
取决于您是否想要带有frequency = 0
的行。我所做的基本上就是使用%
通配符运行LIKE
作为连接条件。
【讨论】:
实际上返回的结果是table1中代码的频率,但我想要的是table1中代码的substr(1,6)数字的频率 更正:table2中代码substr(1,6)的数字频率以上是关于计算重复字段连接的结果的主要内容,如果未能解决你的问题,请参考以下文章
Oracle - ORA-01489:字符串连接的结果太长 [重复]