Sql 需要左表的所有记录,但如果有';在右边的桌子上有一场比赛我还有更多的限制
我发现了非常相似的问题,都涉及WHERE子句中的限制问题,从而破坏了左连接的预期效果。但我无法将这些问题和答案推广到我的情况 我需要左表的所有记录,不管右表是否匹配。如果在正确的表上有一个匹配项,那么可能会有多个匹配项,我会运行一个子查询以获得正确的匹配项 左表的每一行都有一个键和一个计费周期名称,右表的键和日期相同。如果键上有匹配项,那么我只需要返回右表中的记录,该记录的交易日期是匹配左表记录中相应计费周期的最新日期 因此,因为用于从右侧表中选择正确匹配记录的WHERE语句是一个子查询,所以我不能将其保留在左侧联接的ON部分 我的下一个方法是继续,让它作为一个内部查询运行,然后用第二个查询合并这些结果,以提取不匹配的左表记录。听起来很糟糕,但我对暴力手段并不陌生Sql 需要左表的所有记录,但如果有';在右边的桌子上有一场比赛我还有更多的限制,sql,Sql,我发现了非常相似的问题,都涉及WHERE子句中的限制问题,从而破坏了左连接的预期效果。但我无法将这些问题和答案推广到我的情况 我需要左表的所有记录,不管右表是否匹配。如果在正确的表上有一个匹配项,那么可能会有多个匹配项,我会运行一个子查询以获得正确的匹配项 左表的每一行都有一个键和一个计费周期名称,右表的键和日期相同。如果键上有匹配项,那么我只需要返回右表中的记录,该记录的交易日期是匹配左表记录中相应计费周期的最新日期 因此,因为用于从右侧表中选择正确匹配记录的WHERE语句是一个子查询,所以我
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)