【问题标题】:LEFT JOIN with specific criteria具有特定条件的 LEFT JOIN
【发布时间】:2021-02-25 19:26:23
【问题描述】:

在 VBA-Ado 中(访问文件)

T1

id   Item    TransactionDate  
-----------------------------
1    TV      31/12/2017   

T2

id   Item   U_Price      FromDate
--------------------------
1    TV     12.1$        31/12/2018   
2    TV     15.3$        30/11/2019   
3    TV     11.2$        25/02/2020  
4    TV     21.1$        01/05/2016  

我需要一个 LEFT JOIN 以便结果表有 1 条记录(来自 T1)与最相关的 U_Price,在示例中 21.1$ 具有最高的 FromDate 小于 TransactionDate

我试过没有成功

    SELECT
        Item,
        TransactionDate
    FROM
       T1 p
    LEFT JOIN T2 o ON o.Item = p.Item
   WHERE T2.FromDate>=T1.TransactionDate

【问题讨论】:

  • 小于TransactionDate的最高FromDate01/05/2016 ,所以结果应该是21.1$
  • 用您正在使用的数据库标记您的问题。

标签: sql ms-access


【解决方案1】:

一种方法是相关子查询:

select t1.*,
       (select t2.u_price
        from t2
        where t2.item = t1.item and t2.fromdate <= t1.transactiondate
        order by t2.fromdate desc
        fetch first 1 row only
       ) as u_price
from t1;

并非所有数据库都支持标准的fetch 子句。您的数据库可能使用 limitselect top 或其他名称。

在 MS Access 中,您将使用:

选择 t1.*, (选择前 1 个 t2.u_price 从 t2 其中 t2.item = t1.item 和 t2.fromdate

【讨论】:

  • 在 Access db 中使用 VBA-Ado
  • 如何从 t2 获取另一个字段?
  • @user3387046 。 . .这不是您问的问题,但想法是另一个相关的子查询或返回行的 id 然后连接回表。鉴于此问题已得到解答,您可能还想问另一个问题。
【解决方案2】:

我会使用APPLY,而不是加入:

SELECT *
FROM T1
CROSS APPLY (
    SELECT TOP 1 * 
    FROM T2
    WHERE T2.Item = T1.Item
       AND T2.FromDate < T1.TransactionDate
    ORDER BY T2.FromDate DESC
) T2_0

注意:这是特定于 Sql Server 的。你没有告诉我们你有什么样的数据库。其他数据库可能使用LATERAL JOIN 代替APPLY,使用LIMITFETCH 结构代替TOP 1

如果U_Price 确实是您需要的唯一 字段,我也可以将其作为SELECT 子句中的相关派生表(子查询)。

【讨论】:

    【解决方案3】:

    你可以用FIRST_VALUE()窗口函数来做到这一点:

    SELECT DISTINCT T1.Item, T1.TransactionDate, 
           FIRST_VALUE(T2.U_Price) OVER (PARTITION BY T1.Item ORDER BY T2.FromDate DESC) U_Price
    FROM T1 LEFT JOIN T2 
    ON T2.Item = T1.Item AND T2.FromDate <= T1.TransactionDate
    

    请参阅demo
    结果:

    Item TransactionDate U_Price
    TV 2017-12-31 21.1$

    【讨论】:

      猜你喜欢
      • 2020-08-24
      • 2014-03-13
      • 1970-01-01
      • 2017-04-07
      • 2012-08-22
      • 2023-04-06
      • 1970-01-01
      • 2014-07-30
      相关资源
      最近更新 更多