1

データベースに保存されているセクションのリストをSections列 ( sectionId, sectionTypeId, sectionName) のテーブルに、特権のリストを列 ( ) のテーブルUserPrivilagesに持っていますuserPrivilagesId, userId, sectionTypeId

テーブルからすべてのセクションを選択したいのですが、 by に保存されてSectionsいるものをマークします。sectionTypessectionTypeIdUserPrivilagesuserId

何かのようなもの:

SELECT sectionId, sectionTypeId, sectionName, (true/false) as privilage
FROM Sections

これをテーブルに結合UserPrivilagesすると、両方のテーブルにのみ存在する結果が得られますが、ユーザーがt have権限を付与するセクションも必要です。

この true/false は、 from テーブルがテーブルに存在するUserPrivilages場合はsectionTypeIdfromテーブルであり、それ以外の場合は false を返します。SectionsUserPrivilagesuserId

したがって、結果はたとえば

SectionId   sectionTypeId   sectionName   privilage
1           1               Name1         true or 1
2           2               Name2         false or 0
4

1 に答える 1

3

左結合が必要なように思えますCOALESCEが、特権に行が存在しない場合は、おそらく答えを代用する必要があります。

SELECT
  s.sectionId,
  s.sectionTypeId,
  s.sectionName,
  COALESCE(p.privilage,0) as privilage
FROM
  Sections s
    left join
  Privilages p
    on
       s.sectionTypeId = p.sectionTypeId and
       p.UserId = @User

0一致が存在しない場合はどこにでもあります。


または、おそらく、質問を読み直して、から列を選択していないのでp、存在を確認したいだけです:

SELECT
  s.sectionId,
  s.sectionTypeId,
  s.sectionName,
  CASE WHEN p.userPrivilagesId is NULL THEN 0 ELSE 1 END as privilage
FROM
  Sections s
    left join
  Privilages p
    on
       s.sectionTypeId = p.sectionTypeId and
       p.UserId = @User

userPrivilagesId(が の非 NULL 列であると仮定しますp)。

于 2012-12-31T11:12:51.563 に答える