当前位置: 首页 > 面试题库 >

SQL中弱关联表的映射字段

陈志
2023-03-14
问题内容

我正在搜索一个SQL-Query,该查询可以将一组单个大小的项目映射到一组单个大小的存储桶中。

我想满足以下条件:

  • 桶的大小必须大于或等于物品的大小。
  • 每个存储桶只能包含一个项目,或者将其保留为空。
  • 每一件物品只能放在一个桶中。
  • 没有项目可以拆分为多个存储桶。
  • 我想以某种方式填充存储桶,即首先填充最小的未使用存储桶。
  • 然后可以按大小或ID排序初始商品和存储桶集,但不能递增
  • 初始存储桶和商品集的大小和ID可以是任意的,并且不能以已知的最小值开始
  • 当存在有效的映射时,结果必须总是正确的
  • 如果没有有效的映射(例如,如果项目多于存储桶),则允许结果不正确,但是,如果结果为空集或具有指示错误结果的另一个属性/信号,我将不胜感激。

举个例子,假设我的bucket和items表看起来像这样:

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提琴,返回错误结果,但接近,结果看起来像http://sqlfiddle.com/#!15/a6c30/1


问题答案:

使用@SoulTrain中的表定义(但要求数据先进行排序):

; WITH ORDERED_PAIRINGS AS (
    SELECT i.ITEMID, b.BUCKETID, ROW_NUMBER() OVER (ORDER BY i.SIZE, i.ITEMID, b.SIZE, b.BUCKETID) AS ORDERING, DENSE_RANK() OVER (ORDER BY b.SIZE, b.BUCKETID) AS BUCKET_ORDER, DENSE_RANK() OVER (PARTITION BY b.BUCKETID ORDER BY i.SIZE, i.ITEMID) AS ITEM_ORDER
    FROM @ITEM i
    JOIN @BUCKET b
      ON i.SIZE <= b.SIZE
), ITEM_PLACED AS (
    SELECT ITEMID, BUCKETID, ORDERING, BUCKET_ORDER, ITEM_ORDER, CAST(1 as int) AS SELECTION
    FROM ORDERED_PAIRINGS
    WHERE ORDERING = 1
    UNION ALL
    SELECT *
    FROM (
        SELECT op.ITEMID, op.BUCKETID, op.ORDERING, op.BUCKET_ORDER, op.ITEM_ORDER, CAST(ROW_NUMBER() OVER(ORDER BY op.BUCKET_ORDER) as int) as SELECTION
        FROM ORDERED_PAIRINGS op
        JOIN ITEM_PLACED ip
          ON op.ITEM_ORDER = ip.ITEM_ORDER + 1
         AND op.BUCKET_ORDER > ip.BUCKET_ORDER
    ) AS sq
    WHERE SELECTION = 1
)
SELECT *
FROM ITEM_PLACED


 类似资料:
  • 主要内容:关联映射,反转,级联在前面的学习中,我们所涉及的都是基于单表的操作,但在实际的开发过程中,基本上都是同时对多张表的操作,且这些表都存在一定的关联关系。 Hibernate 是一款基于 ORM 设计思想的框架,它将关系型数据库中的表与我们 Java 实体类进行映射,表中的记录对应实体类的对象,而表中的字段对应着实体类中的属性。Hibernate 进行增删改查等操作时,不再直接操作数据库表,而是对与之对应的实体类对象进行

  • 问题内容: 我想使用Hibernate的条件api来制定连接两个实体的特定查询。假设我有两个实体,Pet和Owner,拥有者拥有很多宠物,但是关键是关联没有映射到Java批注或xml中。 使用hql,我可以通过在查询中指定联接来选择拥有“ fido”宠物的所有者(而不是将一组宠物添加到owner类)。 可以使用hibernate条件进行相同的操作吗?如果可以,怎么办? 谢谢,J 问题答案: 我的理

  • 我们从前面的 垃圾回收 章节中知道,JavaScript 引擎在值可访问(并可能被使用)时将其存储在内存中。 例如: let john = { name: "John" }; // 该对象能被访问,john 是它的引用 // 覆盖引用 john = null; // 该对象将会被从内存中清除 通常,当对象、数组这类数据结构在内存中时,它们的子元素,如对象的属性、数组的元素都是可以访问的。 例

  • 我有4节课。其中一个保存有关客户的信息。另一个是关于订单的。另外两个类扮演注册表角色,一个是客户注册表,另一个是订单注册表。 Orders registry有一个哈希映射,如下所示: 客户注册也是如此。 类orders具有int orderid。类客户具有int customerid。我通过两个注册中心添加了演示数据(假设一个客户的客户ID为100,一个订单的订单ID为500)。 我编写了一些简单

  • 第 7 章 关联关系映射

  • 更复杂的关联连接极为罕见。通过在映射文档中嵌入 SQL 片断,Hibernate 也可以处理更为复杂的情况。比如,假若包含历史帐户数据的表定义了 accountNumber、effectiveEndDate 和 effectiveStartDate 字段,按照下面映射: <properties name="currentAccountKey"> <property name="accou