SQL 连接表,其中一个日期时间列与另一列中的多个日期时间值相关

问题描述 投票:0回答:1

我在 MS SSMS 中连接两个表时遇到问题。

表1:

客户ID 购买日期时间
C1 C1的PT1
C1 C1的PT2
... ...
C1 C1 的 PTn
C2 C2的PT1
C2 C2的PT2
... ...

表2:

客户ID 服务日期时间
C1 C1的ST1
C1 C1的ST2
... ...
C1 C1的STm
C2 C2的ST1
C2 C2的ST2
... ...

我想将他们加入到新表中:

客户ID 购买日期时间 服务日期时间
C1 C1的PT1 C1的ST1
C1 C1的PT1 C1的ST2
... ... ...
C1 C1的PT1 C1的STk
C1 C1的PT2 C1的STk+1
C1 C1的PT2 C1的STk+2
... ... ...

一个PurchaseDateTime与多个ServiceDateTime相关。并且最早相关的ServiceDateTime晚于PurchaseDateTime。最后一个相关的ServiceDateTime 早于下一个PurchaseDateTime。并且两个表中的所有日期时间都彼此不同。

例如,对于 Customer1,它就像: PT1 < ST1 < ST2 < ... < STk < PT2 < STk+1... < STk+j < PT3 ...

我尝试了代码:

SELECT 
    t1.CustomerID,
    t1.PurchaseDateTime,
    t2.ServiceDateTime
FROM 
    Table1 t1
JOIN 
    Table2 t2 ON t1.CustomerID = t2.CustomerID
WHERE 
    t2.ServiceDateTime >= t1.PurchaseDateTime
    AND t2.ServiceDateTime <= (
        SELECT MIN(PurchaseDateTime)
        FROM Table1
        WHERE PurchaseDateTime > t1.PurchaseDateTime
    )

然而,它并没有给出我想要的。有人知道如何以正确的方式进行联合以获得上面的合并表吗?

提前致谢!

sql-server datetime left-join one-to-many
1个回答
0
投票

在相关子查询中,您缺少将其范围缩小到特定的 CustomerId。

    SELECT 
    t1.CustomerID,
    t1.PurchaseDateTime,
    t2.ServiceDateTime
FROM 
    Table1 t1
JOIN 
    Table2 t2 ON t1.CustomerID = t2.CustomerID
WHERE 
    t2.ServiceDateTime >= t1.PurchaseDateTime
    AND t2.ServiceDateTime <= (
        SELECT MIN(PurchaseDateTime)
        FROM Table1 
        WHERE PurchaseDateTime > t1.PurchaseDateTime
        AND Table1.CustomerID=t1.CustomerID
    )
© www.soinside.com 2019 - 2024. All rights reserved.