MS Access - SQL LEFT JOIN 多个条件
Posted
技术标签:
【中文标题】MS Access - SQL LEFT JOIN 多个条件【英文标题】:MS Access - SQL LEFT JOIN multiple conditions 【发布时间】:2016-05-18 13:16:45 【问题描述】:我的这段代码运行良好,只是我需要再添加一个条件:
SELECT record1.*,
tbl_mpsregion.maintenanceteam,
tbl_mpsregion.regionmps
INTO tbl_sapforecast
FROM tbl_mpsregion
RIGHT JOIN
(
SELECT sap_ip19.*,
dateserial(RIGHT(trim([SAP_IP19].[PlanDate]),4),mid(trim([SAP_IP19].[PlanDate]),4,2),LEFT(trim([SAP_IP19].[PlanDate]),2)) AS [DATE/FORECAST],
tbl_labourstandard.re,
tbl_labourstandard.manning,
tbl_labourstandard.skillset AS skillset,
tbl_regionmapping.maintenanceplant,
tbl_regionmapping.area,
tbl_regionmapping.region AS region,
tbl_regionmapping.onresponse,
[RE]*[Manning]/60 AS hours
FROM (sap_ip19
LEFT JOIN tbl_labourstandard
ON (
LEFT(sap_ip19.[Task list description],3) = tbl_labourstandard.jemenawc)
AND (
sap_ip19.[MntPlan] = cdbl(tbl_labourstandard.supplypoint )))
LEFT JOIN tbl_regionmapping
ON sap_ip19.location = cdbl([Tbl_RegionMapping].[FittersDistricts])) AS record1
ON (
record1.region = [Tbl_MPSRegion].[Region])
AND (
record1.skillset = [Tbl_MPSRegion].[Skillset]) ;
要添加的标准是:如果 SAP_IP19.MntPlan 与 Tbl_LabourStandard.SupplyPoint 不匹配,则为 Tbl_LabourStandard.SupplyPoint 使用 0。我没有使用 Server 2000,因此使用 CASE 不是解决方案。已经尝试过 IIF 和 SWITCH 但他们没有将查询带入睡眠模式(不评估)。我读到不能使用带有 IIF 或 SWITCH 的 JOINS。请帮忙!
【问题讨论】:
你确定吗? http://www.techonthenet.com/access/functions/advanced/case.php 您使用的是非常旧的访问版本,还是无法处理 CASE 的连接器,或者您尝试的语法可能不太正确...?编辑:没关系,我看到它在 VBA 中可用,但在标准 SQL 中不可用。我想这可能会为您指明替代方案。另请查看 [***.com/questions/247858/…. 很抱歉 - 编辑时间用完了。查看Nz 感谢 GumbyG!我会看不同的例子。我试图在加入条件下使用这些函数,这可能是一种不正确的方式。 我知道你现在想做什么,我怀疑 Nz 不会有帮助。我会尝试移动到两个查询结果的 UNION,其中 tbl_labourstandard 在两者中都内部连接 - 一个与 sap_ip19.[MntPlan] 的链接,另一个与 Tbl_LabourStandard.SupplyPoint 的条件为零。这可行吗? 【参考方案1】:您应该能够添加 if 或开关,但您始终可以使用 OR 来处理 - 这不是最友好的性能,但它应该可以完成工作,示例如下:
LEFT JOIN tbl_labourstandard
ON
(LEFT(sap_ip19.[Task list description],3) = tbl_labourstandard.jemenawc)
AND
((Tbl_LabourStandard.SupplyPoint = SAP_IP19.MntPlan AND
sap_ip19.[MntPlan] = cdbl(tbl_labourstandard.supplypoint))
OR (sap_ip19.[MntPlan] = 0))
【讨论】:
谢谢克里斯!这不会更改记录集。表 LabourStandard 有一个以供应点为 0 的通用工作时间和以供应点为唯一编号的特定工作时间的列表。 SAP_IP19.MntPlan 中只有唯一编号。当然,它们会重复,这就是我将复合材料与 WC 结合使用的原因。 来自您的原始文件 --- '如果 SAP_IP19.MntPlan 与 Tbl_LabourStandard.SupplyPoint 不匹配,则将 0 用于 Tbl_LabourStandard.SupplyPoint' --- 这就是我添加 0 的原因,实际需要什么? 首先,位于 SAP_IP19 中的 MntPlan 不会有 0 LabourStandard.SupplyPoint 会有 0。如果我们在此条件下在 SupplyPoint 中放置 0,它将在记录中找到 MntPlan 的位置复制一行。如果我没记错的话。 这是哪一行 - '在记录中找到 MntPlan 的位置复制一行。' - 如果您不希望 mntPlan 等于 0,那么通过削减 OR,您可以在它们匹配时加入。如果不了解您的表结构或您想要实现的目标,就很难提供帮助。 ... 如果没有上下文,上述内容绝对没有任何意义。您可以修改您的问题,并真正专注于您需要什么以及您的问题是什么,在那里提供表格结构等。或者阅读一些关于问题的堆栈溢出指南,我推荐以下内容:***.com/help/mcve 和 ***.com/help/how-to-ask,也许您将能够获得更好的帮助以解决更好的结构问题。以上是关于MS Access - SQL LEFT JOIN 多个条件的主要内容,如果未能解决你的问题,请参考以下文章
MS-Access 2016 中的“同一张表”LEFT JOIN ON“同一个公共字段”
MS Access 多 (INNER, LEFT & RIGHT) JOIN 查询
LEFT JOIN 不返回 MS Access 左表中的所有行?
access中left join和limit联合分页查询怎么写sql语句?