来自多个表的前 10 个不同值的问题
Posted
技术标签:
【中文标题】来自多个表的前 10 个不同值的问题【英文标题】:issue with top 10 distinct values from multiple tables 【发布时间】:2012-01-20 03:00:10 【问题描述】:我的应用程序有 oracle 后端。该架构的设计使我将用户事务拆分为 12 个每月事务表。每个月一个。现在我想检索在给定日期范围内访问最多不同文档的前 10 个用户。 我目前有一个查询,它对每个用户的文档进行 countDistinct,按此计数的 desc 顺序排序并从中选择前 10 个结果。 我对每个表运行此查询,所有结果都附加到一个列表中。我必须扫描此列表并对每月计数进行总和,然后按 user_id 分组以获取所有 12 个月内每个用户的文档总数。 我意识到这个计数不是正确的计数,因为同一用户在不同月份可能访问了相同的文档。按照我目前的逻辑,这些计数会加起来。
我需要知道我应该使用哪种策略,这样结果才会最准确。我知道一种方法是从单个表中查询,这肯定会给我正确的答案,但我能达到同样的结果吗从查询所有 12 个表?
这里是一月份的示例月表
class TxnSummJan
Long id
Transaction trans
Users grauser
Resources graresource
Integer transactioncount
Date lastaccesseddate
Date currentdate
String accountid
String userlocation
String documentname
String eventdesc
每个月的类似表格..
【问题讨论】:
【参考方案1】:又是我。
您能否将UNION ALL
应用于所有 12 个表,然后将其变为视图?
SELECT
documentname,
user,
accesscount
--and other columns
FROM
(
SELECT
documentname,
user,
accesscount
--and other columns
FROM
txn_jan
UNION ALL
SELECT
documentname,
user,
accesscount
--and other columns
FROM
txn_feb
--and other monthly summary tables
) yearly_summary
【讨论】:
如果我正确理解 OP,就不会有重复,因为不同的表代表事务集合的不相交子集。所以你应该使用UNION ALL
而不是UNION
,这样数据库就不会浪费时间检查重复了。
所以对 12 个表的“选择不同的文档名称 groupby 用户,日期之间”进行联合,创建视图然后再次按用户计数(documentnames)组?
@pri_dev 你需要像上面那样创建一个视图,然后只做一个select distinct document..
。 @David Wallace 同意,性能问题是这里的一个问题。
我想我可能想尝试比较查询单父表和12表并集视图的性能..【参考方案2】:
您可以创建一个视图,它对所有 12 个表执行 union all
。然后从视图中选择。
【讨论】:
以上是关于来自多个表的前 10 个不同值的问题的主要内容,如果未能解决你的问题,请参考以下文章
Microsoft Access - 具有来自不同表的多个条件的 Dlookup
在 s-s-rS Report Builder Execute(@Query) 中对列标题使用动态 SQL - 使用来自 1 个表的值作为来自不同表的值的列标题