2

我对 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"));
4

2 回答 2

2

由于您不再关心,我应该在处理此问题之前阅读评论:这似乎有效,尽管我不愿意创建您的表结构然后放入假数据来测试它。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错误的查询将通过将其一部分保存为查询而不是使用子查询来工作。

于 2012-07-14T09:00:43.337 回答
2

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

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

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

于 2012-07-14T15:10:03.453 回答