使用条件连接 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
加入两个子查询,B
和 C
表各一个:
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
中的策略与B
或C
中的任何内容都不匹配的可能性。 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 sql server中where子句中的if else条件
MS.Access - 在 DoCmd.OpenReport [where 条件] 中使用 2 个过滤条件从表单打印报表