5

私はこれに何日も苦労してきたので、混乱しすぎていたら申し訳ありません...

以下を定義する一連のテーブルがあります。

  1. スキルのグループ
  2. スキル
  3. 上記のグループ内のスキル (多対多)
  4. 役職
  5. それらの職務のスキル (多対多)

データベースの構造は次のようになります。 スキーマ

次のデータを表示する結果セットを作成する必要があります。

すべての職務について、それらの職務内のすべてのスキルを表示します。ただし、各ロールに含まれていない各グループ内のスキルも含めます (NULL またはその他の方法で示されます)。

テーブルとデータを作成するには、この作業コードを参照してください。 SQL Fiddle
長さについてお詫びします。現実的な例を作成するために多くの挿入を行いました。

スキルは役割にPowerPoint追加されませんが、同じグループの他のスキルが追加されることに注意してください。また、スキルが役割に追加されていないHR Managerことにも注意してください。ただし、その役割にはそのグループの他のスキルが存在しないため、このギャップを確認する必要はありません。Recruitment PolicySoftware Manager

私が目指す結果は次のようになります (簡潔にするためにスーパー スターの役割は除きます)。

RoleTitle               GroupTitle                 SkillTitle               SkillIsInRole
----------------------- -------------------------- --------------------------------------
Software Manager        Microsoft Office           Excel                    1
Software Manager        Microsoft Office           Word                     1
Software Manager        Microsoft Office           PowerPoint               1
Software Manager        Microsoft SQL Server       Query Design             1
Software Manager        Microsoft SQL Server       Stored Procedures        1
Software Manager        Microsoft SQL Server       Failover Clustering      1
HR Manager              Microsoft Office           Excel                    1
HR Manager              Microsoft Office           Word                     1
HR Manager              Microsoft Office           PowerPoint               NULL <-- not added to role but exists in same group as other used skills
HR Manager              HR                         Recruitment Policy       1
4

2 に答える 2

1

考えられるすべての組み合わせのセットを準備する必要があると思います ロール 一方で、グループスキル 他方から。これは、Decart 乗算 (通常は CROSS JOIN によって行われます) を行うことによって行われます。その結果、可能なすべてのグループスキルの組み合わせのリストと組み合わされた各役割のリストが得られます。その後、この結果をテーブル tbl_RolesSkills と LEFT JOIN できます。これにより、必要なものが得られます。これは、CTE またはサブクエリを使用して行うことができます。

この例のように見える必要があります

実際には CROSS JOIN は必要ありません。「特定のロールは特定のグループ セットのみを持つ」という部分を見逃していました。サブクエリは 1 つだけで、CTE (共通テーブル式) でも実行できます。

「スーパースター」役も除外。追加したい場合は、WHERE セクションを削除してください。

于 2013-11-10T18:26:45.503 に答える