Запрос SQL Server: как вернуть набор значений в зависимости от условия? - PullRequest
2 голосов
/ 07 февраля 2012

Рассмотрим следующий сценарий (немного надуманный, но менее сложный, чем реальный сценарий, с которым я борюсь):

Университет с онлайновой системой управления документами хочет ограничить, какие преподаватели могут видеть, какие документы.Некоторые профессора могут видеть документы, принадлежащие любому отделу, но некоторые могут видеть только документы, принадлежащие определенным отделам.

Вот схема:

create table Professors (
    ProfessorId int primary key,
    ProfessorName varchar(50)
);

create table Departments (
    DepartmentId int primary key,
    DepartmentName varchar(50)
);

create table ProfessorDepartments (
    ProfessorId int,
    DepartmentId int
);

insert into Professors values (1, 'Professor A'), (2, 'Professor B');
insert into Departments values (1, 'Chemistry'), (2, 'Computer Science'), (3, 'Math'), (4, 'Physics');
insert into ProfessorDepartments values (1,2), (1,3);

И вот сложная часть: у профессора с неограниченным доступом не будет ни одного отдела, перечисленного в таблице ProfessorDepartments .(Таким образом, указанный профессор будет автоматически получать доступ к любым новым кафедрам.)

Как я могу получить список разрешенных кафедр для конкретного профессора?Список должен быть взят из таблицы ProfessorDepartments, если у профессора ограниченный доступ, и из таблицы Departments, если у профессора неограниченный доступ.

Ответы [ 5 ]

3 голосов
/ 07 февраля 2012
SELECT
  Professors.ProfessorName,
  Departments.DepartmentName
FROM
  Professors
LEFT JOIN
  ProfessorDepartments
    ON Professors.ProfessorId = ProfessorDepartments.ProfessorId
LEFT JOIN
  Departments
    ON ProfessorDepartments.DepartmentId = Departments.DepartmentId
    OR ProfessorDepartments.DepartmentId  IS NULL
2 голосов
/ 07 февраля 2012
SELECT Professors.ID as ProfessorID, Departments.ID as DepartmentID, 
    Professors.ProfessorName, Departments.DepartmentName
FROM Professors
    LEFT OUTER JOIN ProfessorDepartments ON ProfessorDepartments.ProfessorID=Professors.ID
    LEFT OUTER JOIN Departments ON ProfessorDepartments.DepartmentID IS NULL OR 
        ProfessorDepartments.DepartmentID=Departments.ID

должен сделать трюк

1 голос
/ 07 февраля 2012

Демс ответ выглядит как лучший.

Вот моя попытка.

SELECT 
    p.ProfessorName, d.DepartmentName
FROM #Professors p
CROSS JOIN #departments d
WHERE NOT EXISTS (
    SELECT * FROM #ProfessorDepartments pd WHERE pd.ProfessorId = p.ProfessorId)

UNION ALL

SELECT p.ProfessorName, d.DepartmentName
FROM #Professors p
INNER JOIN #ProfessorDepartments pd
ON pd.ProfessorId = p.ProfessorId
INNER JOIN #Departments d
ON d.DepartmentId = pd.DepartmentId
0 голосов
/ 07 февраля 2012

Вы можете сделать это так:

declare @prof varchar(50)
select @prof = 'Professor B'

if(select count(pd.ProfessorId) from Professors p
    inner join ProfessorDepartments pd on p.ProfessorId = pd.ProfessorId
    where p.ProfessorName = @prof) = 0
begin
  select DepartmentName from Departments
end
else
begin
  select d.DepartmentName from Professors p
    inner join ProfessorDepartments pd on p.ProfessorId = pd.ProfessorId
    inner join Departments d on pd.DepartmentId = d.DepartmentId
    where p.ProfessorName = @prof
end
0 голосов
/ 07 февраля 2012

Возможно, я не совсем понимаю ваш вопрос, но как на счет этого:

SELECT P.ProfessorName
        ,CASE WHEN D.DepartmentName IS NULL THEN 'Unrestricted Access' ELSE D.DepartmentName END
FROM Professors P LEFT OUTER JOIN ProfessorDepartments PD ON
    P.ProfessorId = PD.ProfessorId
    LEFT OUTER JOIN Departments D ON
        PD.DepartmentId = D.DepartmentId

РЕДАКТИРОВАТЬ

После просмотра решения Уилла я обновил свой сценарий:

SELECT P.ProfessorName, D.DepartmentName
FROM Professors P 
        LEFT OUTER JOIN ProfessorDepartments PD ON P.ProfessorId = PD.ProfessorId
        LEFT OUTER JOIN Departments D ON PD.DepartmentId IS NULL OR PD.DepartmentId = D.DepartmentId
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...