如何加入 MS Access 中的功能?
Posted
技术标签:
【中文标题】如何加入 MS Access 中的功能?【英文标题】:How do I join on a function in MS Access? 【发布时间】:2014-05-20 02:32:19 【问题描述】:我正在尝试在 MS Access 查询中向我的 JOIN
条件添加一个函数。
作为一个简化的例子,假设我有:
tblChild
和tblParent
和tblGrandparent
tblChild
有一个可以为空的ParentId
和GrandparentId
,这取决于哪一个是已知的。我正在尝试编写一个查询来获取提供的更具体的关系。如果这是 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]);
然后,您必须根据需要调整“列”以从 gp
或 gp2
中提取。
【讨论】:
似乎不起作用。我得到相同的JOIN expression not supported
@Matthew 。 . .尝试删除outer
。
是的,它确实有效。只要我添加一盎司的复杂性,它就会失败。
两个连接方法实际上是我刚刚尝试的方法并且它确实有效,然后我将使用SELECT
下方的Nz
方法......虽然仍然让我感到困惑
多重JOIN
方法在我的情况下是不可取的,因为我实际上在这个可选层次结构中有七层。如果我可以在JOIN
条件下使用Nz
,我只需JOIN
每个表一次。使用多个JOIN
方法我必须JOIN
它N 次,其中N 是它在层次结构中的级别:(以上是关于如何加入 MS Access 中的功能?的主要内容,如果未能解决你的问题,请参考以下文章