SQL:基于另一个表设置条件值,具有 BETWEEN 日期条件

Posted

技术标签:

【中文标题】SQL:基于另一个表设置条件值,具有 BETWEEN 日期条件【英文标题】:SQL: Set conditional value based on another table, with a BETWEEN date criteria 【发布时间】:2020-06-17 21:01:15 【问题描述】:

对 SQL 有点陌生,在网上做了一些搜索,但找不到答案。

SQL 数据库是 Snowflake 数据库,我相信它是 ANSI 数据库。

我有一个如下所述的事实表。相同问题/UPC/仓库/日期的组合是可能的,因为每当报告新问题时都会添加新记录。

排除列是我想要弄清楚的——如果问题/UPC/仓库和日期的组合在排除表中,它应该是“Y”,如下所示。

棘手的部分是数据是在个别日期级别,但如果它在范围内,我想排除它。

因此,此处仅应排除 I-100/1234/China/5-5-2019 和 I-324/1349/NewYork/6-1-2019,因为它们与排除表中的值和日期范围相匹配。

我尝试了以下查询,但 DATES BETWEEN 的 SELECT 返回了超过 1 条记录,并给了我这个错误Single-row subquery returns more than one row.

update "FactDetails" 
set "EXCLUDE" = 'Y'

where ("UPC","Warehouse", "Issue") in
    ("UPC","Warehouse", "Issue" from "Exclusions"
     where "PLANT_NUMBER" is not null
     and "ISSUE_CODE" is not null)

and "Date" between 
    (select "DATE_FROM" from "Exclusion"
     where "PLANT_NUMBER" is not null
     and "ISSUE_CODE" is not null) and
    (select "DATE_TO" from "Exclusion"
     where "PLANT_NUMBER" is not null
     and "ISSUE_CODE" is not null);

另一个复杂性是,排除表可以通过 UPC/问题/仓库的组合排除“级别”。仓库是最具体的,如果只是 UPC,它涵盖的数据最多。

【问题讨论】:

用您正在使用的数据库标记您的问题。 【参考方案1】:

如果我理解正确,你可以使用exists

update t
    set exclude = 'Y'
    where exists (select 1
                  from exclusions e
                  where e.issue_code = t.issue_code and
                        e.upc = t.upc and
                        e.warehouse = t.warehouse and
                        t.date between e.date_from and e.date_to
                 );

【讨论】:

谢谢您——您能帮我解决这个小复杂问题吗?排除表可用于 3 个级别,按 UPC/问题/仓库、UPC/问题或 UPC 排除。例如:如果级别为 UPC,则应在该日期范围内排除该 UPC 的所有记录,并且“排除”表中的“发货和仓库”为空。我在主帖中提供了一张图片。我相信我不能只是一个接一个地做三个层次结构,因为一些不应该的数据会被排除。 @xii 。 . .这回答了您在这里提出的问题。您应该提出一个新问题,其中包含对排除表的更完整描述以及适当的样本数据和所需结果。如果您在此处更改问题,您将使此答案无效,这可能会导致投反对票。 刚刚发布的问题,链接在这里***.com/questions/62442059/…

以上是关于SQL:基于另一个表设置条件值,具有 BETWEEN 日期条件的主要内容,如果未能解决你的问题,请参考以下文章

SQL查询中根据表值添加条件

SQL:基于另一个字段值的条件字段输出

另一个表中的 SQL Server 列在视图中具有静态值

如果存在匹配值,则从另一个表中检索数据 - 否则基于第一个连接条件返回

Oracle SQL:根据在另一个表中给定条件的列中找到的值插入

SQL语句 一个表的值与另一个表的字段一致,怎么把两一个表的值作为条件,限定查询的字段