Sql 需要左表的所有记录,但如果有';在右边的桌子上有一场比赛我还有更多的限制

Sql 需要左表的所有记录,但如果有';在右边的桌子上有一场比赛我还有更多的限制,sql,Sql,我发现了非常相似的问题,都涉及WHERE子句中的限制问题,从而破坏了左连接的预期效果。但我无法将这些问题和答案推广到我的情况 我需要左表的所有记录,不管右表是否匹配。如果在正确的表上有一个匹配项,那么可能会有多个匹配项,我会运行一个子查询以获得正确的匹配项 左表的每一行都有一个键和一个计费周期名称,右表的键和日期相同。如果键上有匹配项,那么我只需要返回右表中的记录,该记录的交易日期是匹配左表记录中相应计费周期的最新日期 因此,因为用于从右侧表中选择正确匹配记录的WHERE语句是一个子查询,所以我

我发现了非常相似的问题,都涉及WHERE子句中的限制问题,从而破坏了左连接的预期效果。但我无法将这些问题和答案推广到我的情况

我需要左表的所有记录,不管右表是否匹配。如果在正确的表上有一个匹配项,那么可能会有多个匹配项,我会运行一个子查询以获得正确的匹配项

左表的每一行都有一个键和一个计费周期名称,右表的键和日期相同。如果键上有匹配项,那么我只需要返回右表中的记录,该记录的交易日期是匹配左表记录中相应计费周期的最新日期

因此,因为用于从右侧表中选择正确匹配记录的WHERE语句是一个子查询,所以我不能将其保留在左侧联接的ON部分

我的下一个方法是继续,让它作为一个内部查询运行,然后用第二个查询合并这些结果,以提取不匹配的左表记录。听起来很糟糕,但我对暴力手段并不陌生

key1 billing_period                   key2      date     value
 1    period_1                         1        date_1     a1
 2    period_1                         1        date_2     a2
 3    period_1                         1        date_3     a3
 4    period_1                         3        date_1     a4
                                       3        date_4     a6
期望输出为

 1   period_1  date_2  a2
 2   period_1
 3   period_1  date_4  a6
 4   period_1
因为a)我想要左表中的所有记录,b)date_2是在键值为1的记录中选择的正确日期,date_4符合键值为3的所有可用日期中的标准。这些日期是仍在各自时期内的最新日期


伪代码是“如果存在匹配项key1=key2,则对于所有此类匹配项,返回账单周期内具有最新日期的匹配项”。如果根本没有匹配项,只需返回左表记录。

基本上,您需要一个带条件的左联接:

A LEFT JOIN B
WHERE B.SomeColumn IS NULL OR (some condition)

我无法为连接本身设置条件,事实上,对我来说,解决方案的关键是确保没有任何条件——以便允许左连接完成工作。因此,这里的关键是在尝试连接之前确保正确的表是正确的表

对于这个问题,我首先执行(伪)查询

然后,我的左键作为键和句点上的[alias]加入了这个。看起来效果很好


在我的问题陈述中,我将右表中的日期值作为输出,而实际上我并不需要查看这些日期。我的问题定义很差。下次我会花更多的时间学习这个例子。

这是真的,但似乎有点笨拙,不是吗?对于这种行为,应该有一种新的连接类型,称为
左环行交叉口连接
。这就不那么令人困惑了
SELECT key, value, bp.period as period
FROM rtable, bp
WHERE rtable.date = (SELECT max(rtable2.date) from rtable2, bp2
    WHERE rtable2.date BETWEEN bp2.start AND bp2.end
    AND bp2.period = bp.period)