#sql-server
#sql-сервер
Вопрос:
Клиент вводит заявку и выбирает отдел или, в некоторых случаях, несколько отделов из списка. Мое приложение возвращает отделы, разделенные запятой для каждого идентификатора билета. Это отлично работает. Однако пользователь, возможно, выбрал «ВСЕ» отделы из выборки (DEPARTMENT_ID для выбора ALL равен ‘1’). Затем мне нужно будет вернуть каждый отдел в таблицу Departments, разделенную запятыми.
Ticket Table
TICKET_ID | ISSUE
-------------------------
100 | Power Outage
101 | Internet is not working
Таблица нехватки:
DEPARTMENT_ID | DEPARTMENT
--------------------------
1 | ALL
2 | Accounting
3 | Human Resources
4 | Receiving
Таблица DepartmentTickets
DEPARTMENT_TICKETS_ID | TICKET_ID | DEPARTMENT_ID
----------------------------------------------------------
1 | 100 | 2
2 | 100 | 3
3 | 101 | 1
Используя мой запрос, билет 100 показывает следующие результаты:
Отключение питания: бухгалтерия, человеческие ресурсы
Как я могу заставить тикет 101 отображать следующее:
Интернет не работает: Все, Бухгалтерия, Отдел кадров, Прием
Select ISSUE,
stuff((
SELECT ', ' cast(Departments.DEPARTMENT as varchar(max))
FROM Departments
left join DepartmentTickets
ON DepartmentTicket.TICKET_ID = TICKETS.TICKET_ID
WHERE DepartmentTickets.TICKET_ID = TICKETS.TICKET_ID and DepartmentTickets.DEPARTMENT_ID = Departments.DEPARTMENT_ID
FOR XML PATH('')
), 1, 2, '') AS DEPARTMENTS
FROM TICKETS
WHERE TICKET_ID = '100'
ORDER BY ISSUE
Ответ №1:
Сначала сделайте ваше внутреннее соединение замаскированным под правильное внутреннее соединение. В ON
предложении затем добавьте с OR
проверкой на наличие идентификатора отдела 1
.
И, кстати, если идентификаторы являются целыми числами, а не строками, которыми они кажутся, вам не следует заключать литералы в одинарные кавычки.
SELECT t.issue,
stuff((SELECT ', ' cast(d.department AS varchar(max))
FROM departments d
INNER JOIN departmenttickets dt
ON dt.department_id = d.department_id
OR dt.department_id = 1
WHERE dt.ticket_id = t.ticket_id
FOR XML PATH('')),
1,
2,
'') departments
FROM tickets t
WHERE t.ticket_id = 101
ORDER BY t.issue;