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语句?

MS-Access 中的 SQL:使用 COUNT、JOIN 并返回 0

MS Access 中的 SQL JOIN 问题