0

私が実行しようとしているクエリは

With getusers As
    (Select userID from userprofspecinst_v where institutionID IN
    (select institutionID, professionID from userprofspecinst_v where userID=@UserID) 
    and professionID IN 
    (select institutionID, professionID from userprofspecinst_v where userID=@UserID))

    select username from user where userID IN (select userID from getusers)

これが私がやろうとしていることです。ユーザーIDと、ユーザーIDとその機関と職業のIDを含むビューが与えられた場合、同じ機関IDと職業IDを持つ他のユーザーIDのリストを取得したいと考えています。次に、そのユーザーIDのリストを使用して、別のテーブル(ユーザー)から各ユーザーIDに対応するユーザー名を取得したいと考えています。プロシージャを作成しようとすると、「サブクエリが EXISTS で導入されていない場合、選択リストで指定できる式は 1 つだけです。」というエラーが表示されます。このクエリを作成する方法について正しいアプローチを取っていますか?

4

1 に答える 1

0

次のクエリは、やりたいことを実行する必要があります。

SELECT      u.username

FROM        user AS u
INNER JOIN  userprofspecinst_v AS up ON u.userID = up.userID
INNER JOIN  (SELECT institutionID, professionID FROM userprofspecinst_v 
                 WHERE userID = @userID) AS ProInsts
                     ON (up.institutionID = ProInsts.institutionID 
                                 AND up.professionID = ProInsts.professionID)

事実上、重要な部分は最後の INNER JOIN ステートメントです。これにより、ユーザー ID が属する insitutionsids と professsionids を構成するテーブルが作成されます。次に、同じ機関 ID と職業 ID (ON 条件) を持つビュー内の一致するすべてのアイテムを取得し、これらを対応するユーザー ID のユーザー テーブルにリンクします (最初の JOIN)。

関心のある各ユーザーIDに対してこれを実行するか、クエリの結果(あなたのgetusers)にJOINすることができます(実行しているデータベースエンジンによって異なります)。

JOIN に慣れていない場合は、Jeff Atwood の紹介記事が出発点として適しています。

JOIN ステートメントを使用すると、テーブル間の論理リンクを効果的に探索できます。userId、institutionID、professionID はすべて、外部キーの候補の例です。したがって、各テーブルを常にサブクエリして結果をつなぎ合わせるのではなく、すべてをリンクできます。テーブルをまとめて、必要な行に絞り込みます。それは通常、よりクリーンで保守しやすいアプローチです (ただし、それは意見です)。

于 2012-08-12T20:17:53.997 に答える