SQL中弱相关表的字段映射

2023-12-25

我正在寻找一个 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 http://sqlfiddle.com/#!15/a6c30/1


尝试这个... 我能够使用来实现这个recursive CTE,全部合为 1 个单曲SQL陈述

我唯一的假设是桶和物品数据集已排序。

DECLARE @BUCKET TABLE
    (
     BUCKETID INT
     , SIZE INT
    )

    DECLARE @ITEM TABLE
    (
     ITEMID INT
     , SIZE INT
    )
    ;  
    INSERT INTO @BUCKET
    SELECT 1,2 UNION ALL
    SELECT 2,2 UNION ALL
    SELECT 3,2 UNION ALL
    SELECT 4,4 UNION ALL
    SELECT 5,4 UNION ALL
    SELECT 6,7 UNION ALL
    SELECT 7,9 UNION ALL
    SELECT 8, 11 UNION ALL
    SELECT 9, 11 UNION ALL
    SELECT 10,12 

    INSERT INTO @ITEM
    SELECT 1,2 UNION ALL
    SELECT 2,2 UNION ALL
    SELECT 3,5 UNION ALL
    SELECT 4,11 UNION ALL
    SELECT 5,12;

    WITH TOTAL_BUCKETS
    AS (
        SELECT MAX(BUCKETID) CNT
        FROM @BUCKET
        ) -- TO GET THE TOTAL BUCKETS COUNT TO HALT THE RECURSION
        , CTE
    AS (
        --INVOCATION PART
        SELECT BUCKETID
            , (
                SELECT MIN(ITEMID)
                FROM @ITEM I2
                WHERE I2.SIZE <= (
                        SELECT SIZE
                        FROM @BUCKET
                        WHERE BUCKETID = (1)
                        )
                ) ITEMID --PICKS THE FIRST ITEM ID MATCH FOR THE BUCKET SIZE
            , BUCKETID + 1 NEXT_BUCKETID --INCREMENT FOR NEXT BUCKET ID 
            , (
                SELECT ISNULL(MIN(ITEMID), 0)
                FROM @ITEM I2
                WHERE I2.SIZE <= (
                        SELECT SIZE
                        FROM @BUCKET
                        WHERE BUCKETID = (1)
                        )
                ) --PICK FIRST ITEM ID MATCH
            + (
                CASE 
                    WHEN (
                            SELECT ISNULL(MIN(ITEMID), 0)
                            FROM @ITEM I3
                            WHERE I3.SIZE <= (
                                    SELECT SIZE
                                    FROM @BUCKET
                                    WHERE BUCKETID = (1)
                                    )
                            ) IS NOT NULL
                        THEN 1
                    ELSE 0
                    END
                ) NEXT_ITEMID --IF THE ITEM IS PLACED IN THE BUCKET THEN INCREMENTS THE FIRST ITEM ID
            , (
                SELECT SIZE
                FROM @BUCKET
                WHERE BUCKETID = (1 + 1)
                ) NEXT_BUCKET_SIZE --STATES THE NEXT BUCKET SIZE
        FROM @BUCKET B
        WHERE BUCKETID = 1

        UNION ALL

        --RECURSIVE PART
        SELECT NEXT_BUCKETID BUCKETID
            , (
                SELECT ITEMID
                FROM @ITEM I2
                WHERE I2.SIZE <= NEXT_BUCKET_SIZE
                    AND I2.ITEMID = NEXT_ITEMID
                ) ITEMID -- PICKS THE ITEM ID IF IT IS PLACED IN THE BUCKET
            , NEXT_BUCKETID + 1 NEXT_BUCKETID --INCREMENT FOR NEXT BUCKET ID 
            , NEXT_ITEMID + (
                CASE 
                    WHEN (
                            SELECT I3.ITEMID
                            FROM @ITEM I3
                            WHERE I3.SIZE <= NEXT_BUCKET_SIZE
                                AND I3.ITEMID = NEXT_ITEMID
                            ) IS NOT NULL
                        THEN 1
                    ELSE 0
                    END
                ) NEXT_ITEMID --IF THE ITEM IS PLACED IN THE BUCKET THEN INCREMENTS THE CURRENT ITEM ID
            , (
                SELECT SIZE
                FROM @BUCKET
                WHERE BUCKETID = (NEXT_BUCKETID + 1)
                ) NEXT_BUCKET_SIZE --STATES THE NEXT BUCKET SIZE
        FROM CTE
        WHERE NEXT_BUCKETID <= (
                SELECT CNT
                FROM TOTAL_BUCKETS
                ) --HALTS THE RECURSION
        )
    SELECT 
        BUCKETID
        , ITEMID
    FROM CTE
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SQL中弱相关表的字段映射 的相关文章

  • VS 13/VS 15 - 无法导入 SQL 片段

    我想在中创建 SQL 片段VS2013 and VS2015 我不知道为什么 但我在导入时遇到错误 在两个 VS 中 C sql snippet Missing or unspecified Language attribute 我的片段
  • postgresql 中的锁定表

    我有一个名为 games 其中包含一个名为 title 该列是唯一的 数据库中使用PostgreSQL 我有一个用户输入表单 允许他插入新的 game in games 桌子 插入新游戏的功能会检查之前输入的游戏是否存在 game 与相同的
  • 具有多个主键的 SQLAlchemy 不会自动设置任何

    我有一个简单的表 class test Base tablename test id Column Integer primary key True title Column String def init self title self
  • 有没有办法在 MySQL 中有效地对 TRUNCATE 或 DROP TABLE 进行 GRANT ?

    我最近在 MySQL 5 5 x 中尝试过 GRANT SELECT INSERT UPDATE DELETE TRUNCATE ON crawler TO my user localhost WITH GRANT OPTION 这会导致错
  • SQL Server 中的嵌套事务

    sql server 允许嵌套事务吗 如果是的话那么交易的优先级是什么 来自 SQL Server 上的 MSDN 文档 嵌套交易 http msdn microsoft com en us library ms189336 SQL 90
  • 计算包含字母/数字的行数

    我想要实现的目标很简单 但是解释起来有点困难 我不知道在 postgres 中这是否真的可能 我处于相当基础的水平 SELECT FROM WHERE LEFT JOIN ON HAVING 等等基本的东西 我正在尝试计算包含特定字母 数字
  • 如何在 SQL Server 中保持数据行内

    我正在尝试找出如何检测数据是否在VARCHAR n SQL Server 2008 中的列存储在行内或行外 有谁知道如何做到这一点 另外 如果我们需要数据 有没有办法将数据保持在行中 要查看某个值是行内还是行外 您可以使用DBCC PAGE
  • 在 azure Devops 管道中部署 SQL 时遇到错误

    我在 azure Devops 的发布管道中使用 sql DACPAC 类型的部署 但出现以下错误 我对 SQL 不了解 有什么建议吗 Publishing to database database name on server Serve
  • Woocommerce,基于短代码的产品列表上的排序下拉列表

    在我们的商店里 我们有许多标准的 WP 页面 在这些页面上 我们使用标准 Woocommerce 短代码展示了约 40 种产品 例如 product category category boots per page 20 columns 4
  • 验证 sql/oracle 中的电子邮件/邮政编码字段

    对于以下方面的一些建议将不胜感激 是否可以通过 oracle 中的 sql 中的某种检查约束来验证电子邮件和邮政编码字段 或者我怀疑 pl sql 带有正则表达式的这种事情 Thanks 这是电子邮件地址的正则表达式语法 包括引号 a zA
  • SQL 按计数排序

    如果我有一个表和这样的数据 ID Name Group 1 Apple A 2 Boy A 3 Cat B 4 Dog C 5 Elep C 6 Fish C 我希望根据 Group 的总和从小到大进行排序 例如 A 2条记录 B 1条记录
  • sql server 2008 对 exec 语句的限制

    我只需要仔细检查 t sql 中的 EXEC 命令是否有字符限制 如果我有一个带有 varchar max 的变量并使用 EXEC 执行命令 你认为这样可以吗 thanks 应该没问题 根据这篇 MSDN 文章 http msdn micr
  • 如何将彼此“接近”的纬度/经度点分组?

    我有一个用户提交的纬度 经度点的数据库 并且正在尝试将 接近 点分组在一起 接近 是相对的 但目前看来约为 500 英尺 起初 我似乎只能按前 3 个小数位具有相同纬度 经度的行进行分组 大约是一个 300x300 的盒子 了解当您远离赤道
  • Hibernate saveOrUpdate 与更新与保存/持久

    我正在努力理解休眠方法之间的细微差别 saveOrUpdate update save persist 我知道网站上有一些类似的问题 Hibernate中不同的保存方式有什么区别 https stackoverflow com questi
  • nvarchar 值“3001822585”的转换溢出了 int 列

    我使用以下方法将 Excel 文件导入到 SQL Server Excel 文件将所有值作为字符串 我可以导入文件 除了Barcode SalePrice and Price2 我收到错误 nvarchar 值 3001822585 条形码
  • Magento 设置脚本中的 ALTER TABLE 不使用 SQL

    乔纳森 戴 https stackoverflow com users 336905 jonathan day says 更新不应采用以下形式 SQL命令 我没遇到过 任何 DDL 或 DML 语句不能 通过 Magento 的配置执行 结
  • RANK() OVER PARTITION 并重置 RANK

    如何获得在分区更改时重新启动的 RANK 我有这张表 ID Date Value 1 2015 01 01 1 2 2015 01 02 1
  • 创建日期范围表

    我正在编写一份需要显示每天值的报告 我有查询的开始日期和结束日期 但我希望避免丢失日期 以防表不包含特定日期的值 我正在考虑创建一个基本日期范围表 其中包含开始和结束之间的所有日期 然后将其与数据表左连接以显示每一天的值 我找到了一些适用于
  • 地图路由,像谷歌地图一样吗?

    我一直对地图路由很感兴趣 但我从未找到任何好的入门 甚至高级 级别的教程 有人有任何指示 提示等吗 Update 我主要寻找有关如何实现地图系统 数据结构 算法等 的指导 看看开放街道地图项目 http www openstreetmap
  • 在 SQL 中按键组对行进行顺序编号?

    SQL中有没有办法按顺序添加行号按关键组 假设一个表包含任意 CODE NAME 元组 示例表 CODE NAME A Apple A Angel A Arizona B Bravo C Charlie C Cat D Dog D Dopp

随机推荐

  • 为什么函数 A 主体中的变量查找从全局环境中获取值,而不是调用 A 的函数 B 中的值?

    我定义了一个函数 get lt function o p lt match call expand dots 0 cat sprintf In get it is s n eval tail p 1 1 fn lt switch typeo
  • Android 仪表化单元测试无法解析符号“AndroidJUnit4”

    我尝试将 Android 支持仪器测试添加到我的应用程序中 但我遇到了这个问题 无法解析符号 AndroidJUnit4 我好像没有这个包android support test runner 我的应用程序的 build gradle ap
  • 如何将 4 维输入输入 LSTM?

    我有一个这种形状的序列输入 6000 64 100 50 The 6000只是样本序列的数量 每个序列是64长度 我计划使用 Keras 将这个输入放入 LSTM 中 我这样设置我的输入 input Input shape 64 100 5
  • OS X 中的窗口移动和调整大小 API

    我试图在 OS X 上找到记录的 或者未记录的 如果这是我唯一的选择 API 以从窗口服务器查询窗口列表 然后使窗口移动和调整大小 有人能指出我正确的方向吗 我想我会从 Win32 下的 FindWindowEx 和 MoveWindow
  • 使用 django-haystack 计算模板中的搜索对象总数

    我使用 django haystack 和 xapian 作为后端搜索引擎 我在用FacetedSearchView and FacetedSearchForm用于对搜索进行分面 我已经通过了searchqueryset to the Fa
  • iPhone 在应用程序启动时出现黑屏

    每当我的应用程序启动时 我都会遇到黑屏 没有错误消息 并且我已在 plist 文件中设置了主 nib 文件 这是我的一些代码 AppDelegate h import
  • 使用 Databricks 将 Google Api 的结果写入数据湖

    我正在通过 Databricks 上的 Python SDK 从 Google 管理报告用户使用情况 Api 获取用户使用情况数据 数据大小约为每天 100 000 条记录 我通过批处理处理了一晚上 API 返回的最大页面大小为 1000
  • 查询统计 MySQL 中表的数量

    我正在增加我拥有的表的数量 有时我很好奇只是想进行快速的命令行查询来计算数据库中的表的数量 那可能吗 如果是这样 查询是什么 SELECT COUNT FROM information schema tables WHERE table s
  • oracle中“tab”表和all_tables的区别

    using 返回哪些表 在 oracle 中 select from tab and select from all tables 我想知道两者之间的区别 tab is an ancient永远不应该使用的数据字典表 它的存在只是为了为几十
  • 如何在 JavaScript 中用 替换 %2C?

    q car category Car 20Audio 2CAccessories brand 我从之前提出的问题中借用了这个函数 function insertParam key value key escape key value esc
  • 不使用 NamespacePrefixMapper 定义 Spring JAXB 命名空间

    随着理解的进展进行大量编辑 是否可以让 Spring Jaxb2Marshaller 使用一组自定义的命名空间前缀 或者至少尊重架构文件 注释中给出的前缀 而不必使用 NamespacePrefixMapper 的扩展 这个想法是让一个类与
  • 单击事件作为 Vue.js 中的 props

    我用 Vue js 创建了一个动态覆盖组件来处理关闭事件 当我们在远离预期对象的屏幕上单击时 该对象会关闭我的问题 这里单击事件不起作用 这是我的代码
  • Datadog 事件触发器不返回任何数据而不是 0

    我创建了一个事件监视器 例如 events sources rds event source db instance by dbinstanceidentifier rollup count last 1d gt 1 但当没有任何事件时它返
  • 如何为 OkHttp3 实现自定义 DNS

    我想创建一个自定义DNS https square github io okhttp 4 x okhttp okhttp3 dns 将 CloudFlare 1 1 1 1 和 1 0 0 1 用于我的所有 RetroFit 连接 这应该取
  • 图像膨胀和腐蚀的实现

    我正在尝试找出一种有效的方法来实现二值图像的图像膨胀和腐蚀 据我了解 天真的方法是 循环遍历图像 如果像素为 1 根据结构元素循环遍历邻域 高度和宽度 膨胀 用图像中的值替换图像的每个像素 SE对应位置 侵蚀 检查所有邻域是否等于SE 如果
  • 在哪里更改 activemq 中的预取值

    我读过有关的文档prefetch buffer 根据我的理解如果我分配Prefetchvalue 1给消费者A Activemq一次向A推送1条消息 一旦A向activemq发送确认 则只有activemq向A推送另一条消息 我的疑问是 我
  • 从 Powerpoint 连接到 SQL Server

    如何从 Powerpoint 2007 年或 2010 年 连接到 SQL 数据库以生成报告 我看过很多论坛 其中大多数都在谈论使用外部工具 Check http www officekb com Uwe Forum aspx powerp
  • 在 Ruby on Rails 中获取每组前 N 个项目

    我有一个包含 日期 和 频率 字段的模型 频率是整数 我正在尝试获取每个日期的前 5 个频率 本质上我想按日期分组 然后获取每组前 5 名 到目前为止 我只检索组中的前 1 个 Observation channel channelOne
  • 将单元格中的 Excel 公式转换为 Python 脚本中的函数

    我一直在尝试将 Excel 工作簿中的公式转换为 Python 脚本中的等效 Python 函数或语句 在我的工作场所 我们有旧的 Excel 工作簿 用于工程过程中的计算 例如设计混凝土结构 这些计算涉及到很多公式以及公式之间的引用 我想
  • SQL中弱相关表的字段映射

    我正在寻找一个 SQL 查询 它可以将一组单独大小的项目映射到一组单独大小的存储桶 我想满足以下条件 桶的大小必须大于或等于项目的大小 每个桶只能包含一件物品 或者留空 每件物品只能放入一个桶中 任何项目都不能拆分到多个存储桶中 我想以某种