使用条件连接 MS Access/SQLQuery 中的多个表

Posted

技术标签:

【中文标题】使用条件连接 MS Access/SQLQuery 中的多个表【英文标题】:Join multiple Tables in MS Access/SQLQuery with conditions 【发布时间】:2018-03-23 03:28:06 【问题描述】:

我正在尝试在“策略”字段中加入 3 个表 A、B 和 C。表 B 和 C 也有一个名为“值”的字段。 A 中的 Policy 字段仅存储每个策略的前 4 位,而 B 和 C 存储完整的 7 位。

我要做的是,将 A 和 B 之间每个匹配项的值相加,然后在 C 中查找 A 和 B 之间的每个匹配项;如果策略存在于 C 中,则求和 C 中的值;如果 C 中不存在该策略,则返回 0。最后,取 B 和 C 中的 Values 之间的差,下限为零。

抱歉,我知道这听起来有点令人困惑。我制作了一些简单的表格来说明我在这里要完成的工作。 “...”只是意味着每个表格中没有显示大量其他条目。在所需表中,中间列(B 中的值、C 中的值和计算)不是必需的,仅用于说明。我只关心“最终”数字。

[插图]

现在,我到目前为止所做的尝试:

SELECT 
   Sum(IIf([B]![Value]>[C]![Value],[B]![Value]-[C]![Value],0)) AS [Final]
   FROM [C], [B], [A]
   WHERE (((Left([C].[Policy],4))=[A].[Policy]) AND ((Left([B].[Policy],4))=[A].[Policy]));

(不是这样)显然,这样做的问题是它在内部连接了所有 A、B 和 C,并且不会像我希望的那样对 A 和 B 中的内容而不是 C 中的内容返回零。我应该在哪里改变?

【问题讨论】:

嗨蒂姆!感谢您的回复。很抱歉,我知道这有点令人困惑。这就是为什么我附上了一张表格 A、B、C 和期望结果的图片。你看到了吗? 【参考方案1】:

我会保持简单,只需将A 加入两个子查询,BC 表各一个:

SELECT
    a.Policy,
    Nz(b.b_value, 0) AS b_value,
    Nz(c.c_value, 0) AS c_value,
    Nz(b.b_value, 0) - Nz(c.c_value, 0) AS final
FROM tableA a
LEFT JOIN
(
    SELECT LEFT(Policy, 4) AS Policy, SUM(Value) AS b_value
    FROM tableB
    GROUP BY LEFT(Policy, 4)
) b
    ON a.Policy = b.Policy
LEFT JOIN
    (
    SELECT LEFT(Policy, 4) AS Policy, SUM(Value) AS c_value
    FROM tableC
    GROUP BY LEFT(Policy, 4)
) b
    ON a.Policy = c.Policy;

请注意,您可能还需要处理A 中的策略与BC 中的任何内容都不匹配的可能性。 Nz() 函数对此很有用。

【讨论】:

我确实想处理 A 中的策略与 B 或 C 中的任何内容都不匹配的可能性,在这些情况下,我想在值的列中返回 0。 Nz() 会这样做吗?【参考方案2】:

我认为:

WITH
B1 AS (SELECT LEFT(POLICY,4) AS POLICY,Value AS BValue,0 AS CValue)
,C1 AS (SELECT LEFT(POLICY,4) AS POLICY,0 AS BValue,Value AS CValue)
,D AS (
    SELECT
        A.POLYCY
        ,SUM(isNULL(B1.BValue,0)+isNULL(C2.BValue,0)) AS BValues
        ,SUM(isNULL(B1.CValue,0)+isNULL(C1.CValue,0)) AS CValues
    FROM A
        LEFT JOIN B1 ON B1.POLICY=A.POLICY
        LEFT JOIN C1 ON C1.POLICY=A.POLICY
    GROUP BY A.POLICY
)
SELECT POLYCY,BValues,CValues,BValues-CValues AS Final
FROM D

【讨论】:

由于 MS Acess SQL 不支持 WITH,如果不创建多个中间查询,最好的解决方法是什么?

以上是关于使用条件连接 MS Access/SQLQuery 中的多个表的主要内容,如果未能解决你的问题,请参考以下文章

MS Access 子表单的多个分离条件

Mysql查询二

ms sql server中where子句中的if else条件

MS.Access - 在 DoCmd.OpenReport [where 条件] 中使用 2 个过滤条件从表单打印报表

MS Access 使用表字段作为查询条件

查询不使用 MS-Access 中的日期条件进行拉取