0

まず、これは私が作成しておらず、変更できない DB セットアップ (Access 2010) です。

違反:

違反

パッケージ:

ここに画像の説明を入力

指定された Role1 と Role2 がレコードに一致するときに WorkPackageCodes を選択したいと考えています。たとえば、Role1 が 3 で Role 2 が 8 の場合、ID が 3 と 8 の WorkPackageCode が必要です。たとえば、Role1 が 4 で Role2 が 6 の場合、何も選択しないでください。

複数のクエリでこれを行うことができましたが、これを 1 つのクエリ (サブクエリあり/なし) で実行したいと考えています。そのため、IN で WorkPackageID が他のテーブルの結果セットに含まれているかどうかを確認できるものが必要です。私はこれを試しました:

//3 and 6 will be replaced by parameters
SELECT Role1 AS role FROM tblSODViolations
UNION
SELECT Role2 FROM tblSODViolations
WHERE Role1 = 3 AND Role2 = 6

これにより、目的の結果が得られ、次のように 1 つのクエリを作成しようとしました。

SELECT WorkPackageCode
FROM tblWorkPackages
WHERE WorkPackageID IN (SELECT Role1 AS r FROM tblSODViolations
                        UNION ALL
                        SELECT Role2 FROM tblSODViolations
                        WHERE Role1 = 3 AND Role2 = 6);

しかし、これを実行すると、次のメッセージが表示されます。

この操作はサブクエリでは許可されていません。

では、どうすればこれを達成できますか?または、ある種の SQL if ステートメントで WorkPackageCode を選択する方法はありますか? 前もって感謝します!

4

2 に答える 2

2

ジョインとして試してみてください:

SELECT WorkPackageCode
FROM tblWorkPackages wp join
     tblSODViolations v
     on wp.WorkPackageID in (v.Role1, wp.WorkPackageId = v.Role2) and
        v.Role1 = 3 and v.Role2 = 6;

これにより、重複が生じる可能性があります。もしそうなら、

SELECT distinct WorkPackageCode
FROM tblWorkPackages wp join
     tblSODViolations v
     on wp.WorkPackageID in (v.Role1, wp.WorkPackageId = v.Role2) and
        v.Role1 = 3 and v.Role2 = 6;

ただし、これが機能しない理由は不明です。

SELECT WorkPackageCode
FROM tblWorkPackages wp
WHERE wp.WorkPackageID in (3, 6);

次のように書くこともできます。

SELECT WorkPackageCode
FROM tblWorkPackages wp
WHERE wp.WorkPackageID in (3, 6) and
      exists (select 1 from tblSODViolations where Role1 = 3 and Role2 = 6)

この特定のバージョンは、必要なものを説明した方法に最も近いものです。

于 2013-08-07T12:27:40.257 に答える