2014-10-10 21 views
0

我编写了以下SQL来创建一个列,我可以使用该列来填充表格中的复选框以管理用户权限。Sql:有一列返回1或0,表示表中是否存在一个用于预定组ID的表

SELECT access_b2b.access_id, 
     access_b2b.description, 
     'active'= CASE 
        WHEN access_group.group_id IS NOT NULL THEN 1 
        ELSE 0 
       END 
FROM access_b2b 
     LEFT JOIN access_group 
       ON access_group.access_id = access_b2b.access_id 
WHERE (access_group.group_id = 10 
      OR access_group.group_id IS NULL) 

但是,它并未从access_b2b中选择所有条目。问题是到最后一行:

where (access_group.group_id=10 or access_group.group_id is null)

没有它,我得到重复的条目和不同active返回的值。此外,我意识到这不是合适的条件,因为access_group中的条目可能存在于不同的access_group.group_id,这意味着并非所有其余条目都将被access_group.group_id is null拉入。

我想写我的条件,这样,如果做了沿着线:

这是我努力遵循以下格式:

Where For Each unique access_id in access_group 
    select the one where group_id=10 
    if no group_id=10 
     select any other one 
    end 
end 

最终目标是让以1或0返回的列表示对于预定组ID是否存在access_id。

请注意,在整个解释中,我使用了group_id = 10来简化,稍后将用SqlParameter替换。

任何帮助表示赞赏,非常感谢你!

样本数据(示以简化数据时才有用列)

 
access_group    
access_id group_id 
27   1 
27   11 
28   1 
28   11 
33   1 
33   3 
33   11 
43   11 
44   1 
44   10 
44   11 
... 

access_b2b 
access_id description 
1   Add 
2   Edit 
3   Delete 
4   List 
5   Payments 
6   Open Files 
7   Order 
8   Mod 
... 
+0

您能否提供一些(假的)样本数据?我很难想象你的桌子。 – ohyeah 2014-10-10 12:16:11

+0

肯定@BasR。给我几分钟 – starvator 2014-10-10 12:17:14

+0

@BasR。更新。 – starvator 2014-10-10 12:25:16

回答

2

更改查询到,它应该工作:

SELECT access_b2b.access_id, 
     access_b2b.description, 
     'active'= CASE 
        WHEN access_group.group_id IS NOT NULL THEN 1 
        ELSE 0 
       END 
FROM access_b2b 
     LEFT JOIN access_group 
       ON access_group.access_id = access_b2b.access_id 
        AND (access_group.group_id = 10 
      OR access_group.group_id IS NULL) 

如果你不想被过滤记录在WHERE子句中,移动JOIN中的条件。

如果条件不符合,JOIN将保留行并填充它们,而WHERE子句将过滤结果集。

+0

辉煌!这是有道理的,我试图过滤他们加入后,这是我的问题!谢谢! – starvator 2014-10-10 12:29:33

+1

@starvator不客气。它总是有助于了解/记住查询语句的执行顺序。 – 2014-10-10 12:32:10

相关问题