1

我在具有列 ( ) 的表中存储在数据库中的部分列表和具有列Sections( sectionId, sectionTypeId, sectionName) 的表中的权限。UserPrivilagesuserPrivilagesId, userId, sectionTypeId

我想从表中选择所有部分,Sections但将它们标记sectionTypessectionTypeId存储在UserPrivilagesby中userId

就像是:

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

如果我用表加入这个结果,UserPrivilages我得到的结果只存在于两个表中,但我还想拥有用户t have没有特权的部分。

UserPrivilages如果表存在于表中,则此 true/false 来自sectionTypeId表,否则返回 true,否则为 falseSectionsUserPrivilagesuserId

所以结果将是例如

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 回答