【发布时间】:2014-04-27 17:03:34
【问题描述】:
我正在寻找一个 SQL 查询,它可以将一组不同大小的项目映射到一组不同大小的存储桶。
我想满足以下条件:
- 桶的大小必须大于或等于项目的大小。
- 每个存储桶只能包含一个项目,或者它是空的。
- 每件物品只能放在一个桶中。
- 任何项目都不能拆分到多个存储桶中。
- 我想以某种方式填充存储桶,首先填充最小的未使用存储桶。
- 然后初始项和存储桶集可以按大小或 id 排序,但不是增量的
- 初始存储桶和项目集的大小和 ID 可以是任意的,并且不会从已知的最小值开始
- 当存在有效映射时,结果必须始终正确
- 如果没有有效的映射(例如,如果项目多于存储桶),则允许结果不正确,但如果结果为空集或具有指示不正确的另一个属性/信号,我将不胜感激结果。
举个例子,假设我的存储桶和项目表如下所示:
Bucket: Item:
+---------------------+ +---------------------+
| BucketID | Size | | ItemID | Size |
+---------------------+ +---------------------+
| 1 | 2 | | 1 | 2 |
| 2 | 2 | | 2 | 2 |
| 3 | 2 | | 3 | 5 |
| 4 | 4 | | 4 | 11 |
| 5 | 4 | | 5 | 12 |
| 6 | 7 | +---------------------+
| 7 | 9 |
| 8 | 11 |
| 9 | 11 |
| 10 | 12 |
+---------------------+
然后,我想要一个返回以下结果表的映射:
Result:
+---------------------+
| BucketID | ItemID |
+---------------------+
| 1 | 1 |
| 2 | 2 |
| 3 | NULL |
| 4 | NULL |
| 5 | NULL |
| 6 | 3 |
| 7 | NULL |
| 8 | 4 |
| 9 | NULL |
| 10 | 5 |
+---------------------+
由于没有外键关系或其他东西,我可以将列修复到它们对应的存储桶(但只有关系 Bucket.Size >= Item.Size)我在使用有效 SQL 描述结果时遇到了很多麻烦询问。每当我使用连接或子选择时,我都会在存储桶中获得很大的项目(例如在 12 号存储桶中有一个 2 号项目,而 2 号存储桶仍然可用)或者我在其中得到相同的项目多个桶。
我现在花了一些时间自己寻找解决方案,我几乎可以说,最好不要在 SQL 中声明问题,而是在应用程序中声明问题,即只是获取表。
你认为这个任务在 SQL 中是可能的吗?如果是这样,如果您能帮我解决一个有效的查询,我将不胜感激。
编辑:查询应该至少兼容 Oracle、Postgres 和 SQLite 数据库
编辑 II:一个 SQL Fiddle 与示例查询上方的给定测试集,返回错误的结果,但接近结果可能看起来像 http://sqlfiddle.com/#!15/a6c30/1
【问题讨论】:
标签: sql database sorting mapping bucket-sort