【问题标题】:Giving an alias to a subquery containing a join in access为包含访问连接的子查询提供别名
【发布时间】:2012-07-13 16:57:03
【问题描述】:

我对 SQL Server 的 T-SQL 更有经验,但我一直在 Access 中工作。我的问题是如何为具有自己的连接操作的子查询提供别名。我相信我在谈论嵌套连接操作。我知道我可以创建一个单独的查询,但我没有其他需要,并且希望尽可能保持对象列表干净。我当前的代码如下,我只显示 from 语句,因为它是错误的来源:

FROM 
(
  (
    tblPropertySpecs 
    INNER JOIN 
    (
      tblAssignedBuildingTypes 
      INNER JOIN qryAllPropertyIDs 
      ON tblAssignedBuildingTypes.PropertySpecID = qryAllPropertyIDs.PropertySpecID
    ) 
    ON (tblPropertySpecs.PropertySpecID = tblAssignedBuildingTypes.PropertySpecID) 
    AND (tblPropertySpecs.PropertySpecID = qryAllPropertyIDs.PropertySpecID)
  ) 
  INNER JOIN 
  (
    tblRefConstructionTypes 
    INNER JOIN tblAssignedConstructionTypes 
      ON tblRefConstructionTypes.ConstructionTypeID = tblAssignedConstructionTypes.ConstructionTypeID
  ) 
  ON tblAssignedBuildingTypes.AssignedBuildingTypeID = tblAssignedConstructionTypes.AssignedBuildingTypeID
) 
LEFT JOIN 
(
  tblRefFireSafetyDetectMethods 
  INNER JOIN tblAssignedFireSafetyDetections 
    ON tblRefFireSafetyDetectMethods.FireSafetyDetectedID = tblAssignedFireSafetyDetections.FireSafetyDetectedID
) [q1] 
ON tblAssignedBuildingTypes.AssignedBuildingTypeID = q1.AssignedBuildingTypeID
WHERE (((qryAllPropertyIDs.Status)="Active"));

【问题讨论】:

  • 有什么问题?您似乎有一个别名 [q1]。你可以说As q1 或简单地说(query here) a
  • 感谢 Remou,但我仍然遇到同样的问题。还有其他人有什么选择吗?
  • 我不确定,我会倾向于给你所有的表加上别名INNER JOIN tblAssignedConstructionTypes As a 并确保你不使用与外部别名相同的内部别名,Access 就是这样奇怪。
  • 谢谢,我会把它归结为 Access 问题并创建一个单独的查询,不值得花时间。我感谢你的帮助。如果您创建一个与您的评论相同的答案,我会给您信用。
  • 我敢打赌它写着 Syntax Error in FROM Clause 并指向 [q1]

标签: sql ms-access join alias


【解决方案1】:

我知道我可以创建一个单独的查询,但我没有其他需要它,并希望尽可能保持对象列表干净。

您可以在已保存查询上设置隐藏属性,使其不会显示在数据库窗口(Access 版本 = 2007)中。除非您将“访问”选项设置为“显示隐藏对象”,否则这将防止它弄乱您的查询列表。

您可以通过在查询名称前加上USys 来完成相同的操作,不同之处在于它不会与其他已保存的查询一起显示,除非您将访问选项设置为显示系统对象。

【讨论】:

    【解决方案2】:

    我应该在处理这个之前阅读 cmets,因为你不再关心: 这似乎可行,尽管我不愿意创建您的表结构然后放入假数据来测试它。 Access 愿意尝试在设计视图中显示这一点,以确认它认为 SQL 是可行的。

    Select * FROM 
    ( select * from 
      (  select * from 
        tblPropertySpecs
        INNER JOIN 
        ( select * from 
          tblAssignedBuildingTypes 
          INNER JOIN qryAllPropertyIDs 
          ON tblAssignedBuildingTypes.PropertySpecID = qryAllPropertyIDs.PropertySpecID
        ) as a
        ON (tblPropertySpecs.PropertySpecID = a.PropertySpecID) 
        AND (tblPropertySpecs.PropertySpecID = a.PropertySpecID)
      ) 
      INNER JOIN 
      ( select * from 
        tblRefConstructionTypes 
        INNER JOIN tblAssignedConstructionTypes 
          ON tblRefConstructionTypes.ConstructionTypeID = tblAssignedConstructionTypes.ConstructionTypeID
      ) as b
      ON a.AssignedBuildingTypeID = b.AssignedBuildingTypeID
    ) as c
    LEFT JOIN 
    ( select * from 
      tblRefFireSafetyDetectMethods 
      INNER JOIN tblAssignedFireSafetyDetections 
        ON tblRefFireSafetyDetectMethods.FireSafetyDetectedID = tblAssignedFireSafetyDetections.FireSafetyDetectedID
    ) as q1
    ON c.AssignedBuildingTypeID = q1.AssignedBuildingTypeID
    WHERE (((a.Status)="Active"));
    

    一般来说,关于复杂的 Access 查询有一些奇怪的地方。

    • 如果不比较子查询中的值是非常困难的 给它起别名。你如何参考价值?它是子查询中特定字段的值。

    • 挑剔时访问。有时您需要添加额外的 Select * from 语句以使其满意。

    话虽如此,如果您要做任何远程复杂的事情,创建子查询并将其保存到数据库中要容易得多。它不是那么漂亮,但它肯定更容易。此外,有时获取 Query is too complex 错误的查询将通过将其一部分保存为查询而不是使用子查询来工作。

    【讨论】:

      猜你喜欢
      • 2015-04-20
      • 1970-01-01
      • 1970-01-01
      • 2018-12-02
      • 1970-01-01
      • 1970-01-01
      • 2023-01-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多