Sql 为包含连接访问的子查询提供别名

Sql 为包含连接访问的子查询提供别名,sql,ms-access,join,alias,Sql,Ms Access,Join,Alias,我对SQL server的T-SQL有更多的经验,但我一直在Access中工作。我的问题是如何为具有自己的联接操作的子查询提供别名。我想我说的是嵌套联接操作。我知道我可以创建一个seprate查询,但我不需要它,我希望尽可能保持对象列表的干净。我当前的代码如下,我只显示from语句,因为这是错误的来源: FROM ( ( tblPropertySpecs INNER JOIN ( tblAssignedBuildingTypes INN

我对SQL server的T-SQL有更多的经验,但我一直在Access中工作。我的问题是如何为具有自己的联接操作的子查询提供别名。我想我说的是嵌套联接操作。我知道我可以创建一个seprate查询,但我不需要它,我希望尽可能保持对象列表的干净。我当前的代码如下,我只显示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"));

我应该在处理此问题之前阅读评论,因为您不再关心: 这似乎是可行的,尽管我不愿意创建您的表结构,然后输入假数据来测试它。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"));
一般来说,复杂的访问查询有一些奇怪之处

  • 如果不进行比较,则很难比较子查询中的值 别名。如何引用该值?它是子查询中特定字段的值

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


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

在处理此问题之前,我应该阅读注释,因为您不再关心: 这似乎是可行的,尽管我不愿意创建您的表结构,然后输入假数据来测试它。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"));
一般来说,复杂的访问查询有一些奇怪之处

  • 如果不进行比较,则很难比较子查询中的值 别名。如何引用该值?它是子查询中特定字段的值

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

也就是说,如果您要做任何远程复杂的事情,那么创建子查询并将其保存到数据库中要容易得多。虽然没那么漂亮,但肯定更简单。此外,有时获取查询的查询过于复杂,错误将通过将其部分保存为查询而不是使用子查询来解决。

“我知道我可以创建一个seprate查询,但我不需要它,我希望尽可能保持对象列表的干净。”

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

通过在查询名称前面加上
USys
,您可以完成大致相同的事情,不同的是,除非您将访问选项设置为显示系统对象,否则它不会与其他保存的查询一起显示。

“我知道我可以创建一个seprate查询,但我不需要它,我希望保持对象列表尽可能干净。”

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


通过在查询名称前面加上
USys
,您可以完成大致相同的事情,不同的是,除非您将访问选项设置为显示系统对象,否则它不会与其他保存的查询一起显示。

有什么问题吗?您似乎有一个别名[q1]。您可以将
称为q1
,或者干脆称为
(此处查询)a
谢谢Remou,但我仍然有同样的问题。其他人还有其他选择吗?我不确定,我倾向于将所有表的
内部联接tblAssignedConstructionTypes别名为a
,并确保您不使用与外部别名相同的内部别名,Access就像这样奇怪。谢谢,我将其记为Access起诉并创建一个单独的查询,不值得花时间。我很感激你的帮助。如果你创建一个与你的评论内容相同的答案,我会给你评分。我敢打赌它在FROM子句中说
语法错误,并指出[q1]有什么问题?你似乎有一个别名[q1]。你可以说
为q1
或干脆说
(此处查询)a
谢谢Remou,但我仍然有同样的问题。其他人还有其他选择吗?我不确定,我倾向于将所有表的
内部联接tblAssignedConstructionTypes别名为a
,并确保您不使用与外部别名相同的内部别名,Access就像这样奇怪。谢谢,我将其记为Access起诉并创建一个单独的查询,不值得花时间。我感谢您的帮助。如果您创建一个与您的评论内容相同的答案,我将给予您信任。我打赌它在FROM子句中显示
语法错误,并指向[q1]