0

注文システムがあります。のユーザーは、異なるユーザーのタイプとして異なる注文に添付できます。注文に関連するドキュメントをダウンロードできます。ドキュメントは、注文の特定のタイプのユーザーにのみ提供されます。ドキュメントを表示するユーザーの権限を確認し、ドキュメントに関する情報を選択するためのクエリを作成するのに問題があります。

次のテーブルと(該当する)フィールドがあります。

Docs: DocNo, FileNo
DocAccess: DocNo, UserTypeWithAccess
FileUsers: FileNo, UserType, UserNo 

私は次のクエリを持っています:

SELECT Docs.* 
FROM Docs
WHERE DocNo = 1000
  AND EXISTS (
         SELECT * FROM DocAccess
         LEFT JOIN FileUsers
           ON FileUsers.UserType = DocAccess.UserTypeWithAccess 
           AND FileUsers.FileNo = Docs.FileNo /* Errors here */
         WHERE DocAccess.UserNo = 2000 )

問題は、Exists Selectで、Docs(Docs.FileNo)を有効なテーブルとして認識しないことです。2番目のon引数をwhere句に移動すると、それは機能しますが、事後にフィルターで除外するのではなく、最初の結合を制限したいと思います。

私はこれをいくつかの方法で回避することができますが、これが最善のようです。ここで足りないものはありますか?それとも単に許可されていないのですか?

4

3 に答える 3

2

これはデータベース エンジンの制限だと思います。ほとんどのデータベースでは、句と節docsの両方を含む、サブクエリ全体の範囲になります。wherein

ただし、特定の節をどこに置くかを気にする必要はありません。SQL は記述言語であり、手続き型言語ではありません。SQL の目的は、出力を記述することです。SQL エンジン、パーサー、およびコンパイラーは、最適な実行パスを選択する必要があります。常に正しいとは限りません。ただし、条件をwhere句に移動し、心配する必要はありません。

于 2013-01-15T02:05:40.410 に答える
0

これを機能させるには、エイリアスを使用する必要があります。

SELECT
  doc.* 
FROM 
  Docs doc
WHERE 
      doc.DocNo = 1000
  AND EXISTS (
SELECT 
  * 
FROM 
  DocAccess acc
LEFT OUTER JOIN 
  FileUsers usr
ON 
      usr.UserType = acc.UserTypeWithAccess 
  AND usr.FileNo   = doc.FileNo
WHERE 
  acc.UserNo = 2000
)

これにより、各フィールドがどのテーブルに属しているかも明確になります(同じクエリで、異なるエイリアスを使用して同じテーブルを2回以上使用することを検討してください)。

出力を1行に制限したい場合は、次を使用できますTOP 1

SELECT TOP 1
  doc.* 
FROM 
  Docs doc
INNER JOIN
  FileUsers usr
ON  
  usr.FileNo = doc.FileNo
INNER JOIN
  DocAccess acc
ON
  acc.UserTypeWithAccess = usr.UserType
WHERE 
      doc.DocNo  = 1000
  AND acc.UserNo = 2000

もちろん、2番目のクエリは最初のクエリとは少し異なります(両方のJOINSは内部です)。データモデルに依存するTOP 1と、そのクエリから除外することもできます。

于 2013-01-15T12:13:36.697 に答える
0

サブクエリで FileUsers に参加する必要があるのはなぜですか? クエリの目的とアイデアは何ですか (平易な英語で)?

いずれにせよ、FileUsers と結合する必要がある場合は、内部結合を使用して 2 番目のフィルターを WHERE 条件に移動することをお勧めします。サブクエリの JOIN 条件で使用できるとは思いません。少なくとも、この方法で使用されたことはありません。WHERE句を介してのみ関連付けることができると思います。

于 2013-01-15T01:59:11.193 に答える