如何加入 MS Access 中的功能?

Posted

技术标签:

【中文标题】如何加入 MS Access 中的功能?【英文标题】:How do I join on a function in MS Access? 【发布时间】:2014-05-20 02:32:19 【问题描述】:

我正在尝试在 MS Access 查询中向我的 JOIN 条件添加一个函数。

作为一个简化的例子,假设我有:

tblChildtblParenttblGrandparent

tblChild 有一个可以为空的ParentIdGrandparentId,这取决于哪一个是已知的。我正在尝试编写一个查询来获取提供的更具体的关系。如果这是 TSQL,它将是:

SELECT
    columns
FROM
    tblChild AS c
LEFT OUTER JOIN
    tblParent AS p
        ON p.[Id] = c.[ParentId]
LEFT OUTER JOIN
    tblGrandparent AS gp
        ON gp.[Id] = COALESE(p.[GrandParentId], c.[GrandParentId])

但我不知道如何将 COALESCE 样式函数放入 Access 中的 JOIN 条件中。这是我期望的工作:

SELECT
    columns
FROM
    (tblChild AS c
LEFT OUTER JOIN
    tblParent AS p
        ON p.[Id] = c.[ParentId])
LEFT OUTER JOIN
    tblGrandparent AS gp
        ON gp.[Id] = Nz(p.[GrandParentId], c.[GrandParentId])

【问题讨论】:

这应该可以正常工作除了设计者不知道如何表示它。但是,如果您在 SQL 视图中工作,那么您就可以开始了。如果您切换回设计器并进行更改(例如添加一列),它将从头开始重写查询并失去您的联接。 @Brad 我只在 SQL 视图中工作......设计师对我来说更麻烦。它不运行.... 设计器视图有时看起来很麻烦,但 Access 具有它喜欢的特定语法,如果您习惯于 T-SQL,它可能不直观。因此,使用设计器制作查询的基本部分(连接、别名......)可以提供帮助。然后,一旦制作完成,您就可以切换到 SQL 视图并添加设计人员无法添加的部分。 重新打开,问题与建议的副本无关。这个问题是关于 Access 中的复杂连接的。 【参考方案1】:

我希望NZ() 能够工作。但是你可以改用or 吗?

SELECT columns
FROM (tblChild AS c LEFT JOIN
      tblParent AS p
      ON p.[Id] = c.[ParentId]
     ) LEFT JOIN
    tblGrandparent AS gp
    ON (gp.[Id] = p.[ParentId] or gp.[Id] = c.[GrandParentId]);

这并不完全相同。形式上,最后一个条件是:

    ON (gp.[Id] = p.[ParentId] or gp.[Id] = c.[GrandParentId] and gp.[Id] <> p.[ParentId]);

编辑:

另一种方法是两个连接:

SELECT columns
FROM ((tblChild AS c LEFT JOIN
       tblParent AS p
       ON p.[Id] = c.[ParentId]
      ) LEFT JOIN
     tblGrandparent AS gp
     ON (gp.[Id] = p.[ParentId])
    ) LEFT JOIN
    tblGrandparent AS gp2
    ON gp.[Id] = c.[GrandParentId]);

然后,您必须根据需要调整“列”以从 gpgp2 中提取。

【讨论】:

似乎不起作用。我得到相同的JOIN expression not supported @Matthew 。 . .尝试删除outer 是的,它确实有效。只要我添加一盎司的复杂性,它就会失败。 两个连接方法实际上是我刚刚尝试的方法并且它确实有效,然后我将使用SELECT 下方的Nz 方法......虽然仍然让我感到困惑 多重JOIN 方法在我的情况下是不可取的,因为我实际上在这个可选层次结构中有七层。如果我可以在JOIN 条件下使用Nz,我只需JOIN 每个表一次。使用多个JOIN 方法我必须JOIN 它N 次,其中N 是它在层次结构中的级别:(

以上是关于如何加入 MS Access 中的功能?的主要内容,如果未能解决你的问题,请参考以下文章

MS Access 中的加入或子查询

SQL 加入 MS ACCESS 中的最新记录

加入sql还是ms-access?

在 MS Access 中创建存储过程?

加入时更新 MS Access 语法错误

MS ACCESS 过滤器组合框所有选项