2014-10-22 3 views
0

enter image description hereT-SQL присоединиться запрос с странным состоянием

У меня есть три члена, которые принадлежат компании и третий член является администратором

Учитывая номер три идентификатора пользователя (03) Мне нужно, чтобы все остальное члены, которые принадлежат к одной и той же компании, которые не ADMIN

Пожалуйста, помогите

+0

oh ... not admin. поэтому '<> '02'' или' <>' Admin'', а затем где 'user.id <> '03'' или' links.user <>' 03 '... just ... select * from link где группа <> '02' и пользователь <> '03' и присоединяются к пользовательским и групповым таблицам, если вы хотите получить дополнительные данные (имена n таких). –

+0

Третий член не админ ... кстати. и есть четыре пользователя. –

+1

Почему у ваших идентификаторов есть ведущие нули? скажите, что они не строки! –

ответ

0

отредактирован после комментария. внутренний выбор больше не возвращает группу администратора. используя in вместо =.

Я предлагаю подход, в котором вы определяете пользователей admin, а затем выберите всех пользователей из той же группы, что и указанный идентификатор пользователя, а затем исключите первый список. как это:

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 
+0

Такая же проблема, как и ответ Гордона, подзапрос возвращает более 1 значения, и вы используете =. –

+0

пользователь admin принадлежит группе «компания» и «администратор», поэтому выберите [Группа] из [Ссылка], где [пользователь] = @searchuser не будет работать – LeBlues

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 (а также все другие базы данных). Вы не должны использовать зарезервированные слова для имен столбцов или таблиц. Я предполагаю, что в этом примере используются упрощенные имена.

+0

Подзапрос вернул более 1 значения: этот код не работает, потому что вы необходимо использовать IN, а не = при проверке компании, пользователь 3 находится в обоих. –

+0

@KevinCook. , , Теперь я понимаю, что я совершенно смущен. Что значит быть в одной компании? –

+0

Пример, который дал пользователь, был плохим, он должен был сделать как минимум 2 уровня доступа для разных компаний, а не 1. –

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 
+0

Что такое несколько компаний? – LeBlues

+0

, то вы бы добавили предложение where для желаемой компании, в вашем тестовом случае была только компания и администратор. –

+0

Я добавил более сложный пример с несколькими типами админов и несколькими компаниями –

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 
0

Вы упомянули, что вам нужны только пользователи, принадлежащие к той же компании, которые не являются администраторами, вот что я сделал: сначала создала все таблицы, как у вас есть, затем вставила данные и выполнила запрос, чтобы получить желательные результаты:

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) 
0

я использовал

except 

получить список пользователей из вереска, который принадлежит к "Компания"

кроме

получить список пользователей, которые принадлежат к «администратору»

+0

, то почему это флаг только как tsql, а не C#/linq? –

+0

кроме t-sql – LeBlues

Смежные вопросы