【发布时间】:2017-07-03 20:26:05
【问题描述】:
这是域的简化模型
简而言之,单位将文件授予客户。有两种类型的单元:主单元和它们的子单元。两者都属于同一个省,一个省可能属于多个城市。文档有许多事件(处理历史)。客户属于一市一省。
我必须编写查询,它返回 随机 组文档,给定目标主机代码。以下是标准:
- 返回最新 event_code = 10 的 10 个文档
- 每份文件必须属于居住在单位所在地区任何城市(首选不同城市)的不同客户
- 返回客户符合条件的最新文档
- 必须结果中同时存在这两种文档类型
- 每个查询的结果(选择的客户)应该是随机的
但是……
- 如果没有足够的客户,请尝试使用同一客户的多个文档作为最后的手段
- 如果文档也不够多,尽量返回
- 如果没有其他文档类型的单个实例,则全部返回
可能有几百万行,而且查询一定要快,要经常执行。
我不确定如何以理智的方式构建这种复杂的查询。我正在使用 Oracle 和 PL/SQL。这是我尝试过的东西,但它没有按预期工作(返回错误数据)。我应该如何重构这个查询并获得随机结果,并遵守所有这些边界规则?我也担心连接和位置的性能。
CURSOR c_documents IS
WITH documents_cte AS
SELECT d.document_id AS document_id, d.create_dt AS create_dt,
c.customer_id
FROM documents d
JOIN customers c ON (c.customer_id = d.customer_id AND
c.province_id = (SELECT region_id FROM unit WHERE unit_code = 1234))
WHERE exists (
SELECT 1
FROM event
where document_id = d.document_id AND
event_code = 10
AND create_dt =
SELECT MAX(create_dt)
FROM event
WHERE document_id = d.document_id)
SELECT * FROM documents_cte d
WHERE create_dt = (SELECT MAX(create_dt)
from documents_cte
WHERE customer_id = d.customer_id)
如何在考虑到随机性的情况下正确地进行此查询?我不是要求确切的解决方案,但至少是指导方针。
【问题讨论】:
-
文档和事件有什么关系?我没有看到一个通用的字段名称。其实我没有看到很多对应的字段名。
-
IIRC,mysql 没有 CTE。
-
@jbrahy 我只是忘记在图片中包含外键。如您所见,它们之间存在一对多的关系
-
所以区域实际上只是两个级别;省和他们的城市?我可以通过查看它的类型或注意到它有一个 parent_region 来检测一个城市。我可以通过查看它的类型或注意到它没有 parent_region 来检测一个省。正确的?所以只有两个级别具有冗余类型信息。我会为每个城市找到一个省。这一切都正确吗?
-
这是正确的