带有奇怪条件的t-sql连接查询

时间:2014-10-22 11:35:48

标签: sql sql-server tsql

enter image description here

我有三个属于公司的成员,第三个成员是管理员

鉴于第三个用户ID(03)我需要获得属于同一公司但不是管理员的所有其他成员

请帮忙

6 个答案:

答案 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”的用户列表