我有三个属于公司的成员,第三个成员是管理员
鉴于第三个用户ID(03)我需要获得属于同一公司但不是管理员的所有其他成员
请帮忙
答案 0 :(得分:0)
评论后编辑。内部选择不再返回管理员组。使用in
代替=
。
我建议您定义管理员用户,然后选择与给定用户ID相同的组中的所有用户,然后排除第一个列表。像这样:
declare @searchuser varchar(2) = '03';
with admins as (
select [user]
from [Link] l
join [Groups] g
on l.[Group] = g.[id]
where g.[name] != 'Admin'
)
select u.[id]
, u.[name]
from [Users] u
join [Link] l
on u.[id] = l.[user]
where l.[Group] in (select [Group]
from [Link]
where [user] = @searchuser
and [Group] != (select [id]
from [Groups]
where [name] != 'Admin')
)
and u.[id] not in (select [user] from admins)
and u.[id] != @searchuser
答案 1 :(得分:0)
这是一种方法:
select l.user
from link l join
groups g
on l.group = g.id
where l.group = (select g3.group
from link l3 join
groups g3
on l3.group = g.id and g.name = 'Company'
where l3.user = '03'
) and
g.name <> 'Admin';
请注意,group
是SQL Server(以及所有其他数据库)中的保留字。您不应该为列名或表名使用保留字。我假设该示例使用简化名称。
答案 2 :(得分:0)
让我们制作一些测试数据
DECLARE @users TABLE
(
ID INT,
NAME VARCHAR(20)
)
INSERT INTO @users
VALUES
( 1, 'one' ),
( 2, 'two' ),
( 3, 'three' ),
( 4, 'four' ),
( 5, 'five' );
DECLARE @groups TABLE
(
ID INT,
NAME VARCHAR(20)
)
INSERT INTO @groups
VALUES
( 1, 'CompanyA' ),
( 2, 'CompanyB' ),
( 3, 'CompanyC' ),
( 4, 'CompanyD' ),
( 5, 'AdminA' ),
( 6, 'AdminB' ),
( 7, 'AdminC' ),
( 8, 'AdminD' ),
( 9, 'AdminAll' );
DECLARE @link TABLE
(
USERID int,
GROUPID int
)
INSERT INTO @link
VALUES
( 1, 1 ),
( 2, 1 ),
( 3, 1 ),
( 3, 2 ),
( 3, 5 ),
( 4, 2 ),
( 5, 1 ),
( 5, 2 ),
( 5, 9 );
现在我们只是查看谁有公司访问权限,但没有公司管理员访问权限(或管理员通过所有公司访问权限)
SELECT *
FROM @users u
INNER JOIN @link l
ON l.USERID = u.ID
INNER JOIN @groups g
ON g.ID = l.GROUPID
WHERE u.ID NOT IN
(
SELECT l.USERID
FROM @link l
INNER JOIN @groups g
ON g.ID = l.GROUPID
WHERE g.NAME = 'AdminB' OR g.NAME = 'AdminAll'
)
AND g.NAME = 'CompanyB'
输出:
ID NAME USERID GROUPID ID NAME
3 three 3 2 2 CompanyB
4 four 4 2 2 CompanyB
答案 3 :(得分:0)
这个没有使用子查询
select A.* from user A join Link B on A.id = B.[User]
join Groups C on B.Group = C.id and c.id <> '02'
join (select A.id, B.Group from user A join link B on A.id = B.user where id = '03') D on
B.Group = D.Group
答案 4 :(得分:0)
您提到您只需要属于同一公司且不是Admin的用户,这就是我所做的:首先创建所有表,然后插入数据,然后运行查询以获得所需的结果:
CREATE TABLE [dbo].[groups]
(
[id] [int] NULL,
[name] [varchar](50) NULL
)
CREATE TABLE [dbo].[users]
(
[ID] [int] NULL,
[Name] [varchar](50) NULL
)
CREATE TABLE [dbo].[Link]
(
[user] [int] NULL,
[group] [varchar](50) NULL
)
;WITH cte
AS
(
SELECT U.ID, U.NAME, L.[group]
FROM users U
LEFT OUTER JOIN [dbo].[Link] L ON U.ID = L.[user]
)
SELECT *
FROM cte
WHERE [group] <> 2 AND cte.ID NOT IN ( SELECT [user]
FROM Link
WHERE [group] = 2)
答案 5 :(得分:0)
我用过
except
获取属于“公司”的Ling的用户列表
除了
获取属于“Admin”的用户列表