2

私は SQL サーバーの 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) に表示されないように、保存されたクエリに Hidden 属性を設定できます。これにより、Access オプションを Show Hidden Objects に設定していない限り、クエリ リストが乱雑になるのを防ぐことができます。

クエリ名の前に を付けることでほぼ同じことを実現できますがUSys、[アクセス] オプションを [システム オブジェクトを表示] に設定しない限り、他の保存されたクエリと一緒に表示されないという違いがあります。

于 2012-07-14T15:10:03.453 に答える