【问题标题】:Looping through SQL table to create a new table based on another table's data循环遍历 SQL 表,根据另一个表的数据创建一个新表
【发布时间】:2021-10-04 21:50:08
【问题描述】:

SQL 中是否有任何方法可以遍历一个表并根据另一个表中的数据创建一个新表?

我不熟悉 T-SQL,它在我对该主题的很多搜索中都返回了,但我想知道是否有办法在纯 SQL 中做到这一点?

这是我拥有的两个表的示例:Invoice 和 EVENT

我想通过迭代创建的表是 Last Event To Invoice。

表格示例:

我知道这里的逻辑,但我不确定如何在 SQL 中以最佳方式实现这一点。

  1. 遍历每张发票并获取公司 ID、发票日期
  2. 遍历公司 ID = 当前公司 ID 的 EVENT 表
  3. 获取 invoice_date 之前的最新事件
  4. 将该信息放入一个新表中

【问题讨论】:

    标签: sql database loops iteration


    【解决方案1】:

    您最好编写基于集合的查询并让引擎做出决定,而不是担心循环。

    您的查询将在需要时逐行运行。

    这是一个使用 CROSS APPLY 的示例,但子查询或 row_number() 解决方案会给出相同的结果。

    with invoice(invoice_date) as (
    select cast('2021-01-10' as date)
    ) --sample data
    
    , event(event_date) as (
    select cast('2021-01-08' as date)
    union all select cast('2021-01-11' as date)
    union all select cast('2021-01-09' as date)
    ) --sample data
    
    SELECT Invoice.invoice_date
    --other fields here
    , e.event_date as last_event_date
    
    FROM Invoice
    CROSS APPLY(
        SELECT TOP 1 event_date
        FROM event
        WHERE event_date <= invoice_date
        ORDER BY event_date DESC
    )e
    

    【讨论】:

    • 这适用于更大的数据集吗?例如,当您选择日期时 - 如果我不提前知道日期怎么办?
    • 日期只是示例数据,因此可以重现,因为问题中没有提供。你想要的部分在最后。
    猜你喜欢
    • 2019-09-24
    • 1970-01-01
    • 2019-10-15
    • 2014-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多