SQL-如何从外部联接表中排除某些数据

时间:2018-08-07 16:22:53

标签: sql-server

这个问题使我感到困惑。这是我的数据的简化版本:

表1:“停留”-客户从开始日期到结束日期都有“停留”

Stay ID | Client ID | Start Date | End Date
1       | 1         | 2018-01-01 | 2018-01-31
2       | 2         | 2018-01-01 | 2018-01-31
3       | 3         | 2018-01-01 | 2018-01-31
4       | 1         | 2018-03-01 | *Null*
5       | 2         | 2018-03-01 | *Null*
6       | 4         | 2018-03-01 | *Null*
7       | 5         | 2018-03-01 | *Null*

表2:“家庭”-从开始日期到结束日期,有些客户是家庭的一部分

ID | Client ID | Family ID | Start Date | End Date
1  | 1         | 1         | 2017-11-01 | 2017-11-30
2  | 2         | 2         | 2018-01-01 | 2018-01-31
3  | 3         | 2         | 2018-01-01 | 2018-01-31
4  | 1         | 3         | 2018-03-01 | *Null*
5  | 6         | 4         | 2018-01-01 | 2018-01-31

所以我在Stays上加入家庭。客户ID =家庭。客户ID。

现在这是我正在尝试做的。我正在使用Crystal Reports,并且想要在Stays表中显示所有内容。然后,如果客户在住宿时是家庭成员,我也想显示家庭ID。如果不是,我希望它显示为空。因此输出可能看起来像这样:

Stay ID | Client ID | Family ID
1       | 1         | *Null*
2       | 2         | 2
3       | 3         | 2
4       | 1         | 3
5       | 2         | *Null*
6       | 4         | *Null*
7       | 5         | *Null*

我已经尝试了许多不同类型的逻辑来尝试实现这一点。我只需要从开始日期和结束日期没有重叠的家庭中排除记录,例如,家庭记录4,但是我需要包括所有有住宿的客户,并且对于有多个家庭记录和/或多个住宿记录的客户(例如客户1),正确识别与住宿重叠的家庭。

在此先感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

您可以使用子查询来做到这一点:

SELECT
    StayID
    , ClientID
    , StartDate
    , EndDate
    , FamilyID = (SELECT TOP 1 FamilyID FROM tblFamilies WHERE StartDate >= ts.StartDate AND EndDate <= ts.EndDate AND ClientID = ts.ClientID ORDER BY StayID DESC)
FROM tblStays ts ;