Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Помогите с запросом  [new]
Wr
Member

Откуда: Питер
Сообщений: 134
Есть пару таблиц (человек, сотрудник, филиал, отдел, должность)
Надо создать три запроса на выборку:
1. Выбрать только действующих сотрудников (поле MAN_WORKER в таблице T_MAN = true)
2. Выбрать только уволенных сотрудников (поле MAN_WORKER в таблице T_MAN = false)
3. Отобразить всех людей

В результате выборки должны быть следующие столбцы:
MAN_ID
MAN_FIRST_NAME
MAN_MIDDLE_NAME
MAN_LAST_NAME
AREA_NAME
DEPARTMET_NAME
WORKER_CODE

Причём, если человек уволен, то в полях AREA_NAME, DEPARTMENT_NAME,... должно выводиться NULL

Помогите, а то я совсем что-то запутался :(

К сообщению приложен файл. Размер - 66Kb
12 ноя 11, 18:01    [11587177]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Wr
Member

Откуда: Питер
Сообщений: 134
Ну, что-то начало получаться.
Для уволенного персонала (MAN_WORKER = false)
Сделал следующую вьюшку:
SELECT     dbo.T_MAN.MAN_ID, dbo.T_WORKER.WORKER_CODE, dbo.T_MAN.MAN_FIRST_NAME, dbo.T_MAN.MAN_MIDDLE_NAME, dbo.T_MAN.MAN_LAST_NAME, 
                      dbo.T_AREA.AREA_NAME, dbo.T_DEPARTMENT.DEPARTMENT_NAME, dbo.T_ROLE.ROLE_NAME
FROM         dbo.T_MAN LEFT OUTER JOIN
                      dbo.T_WORKER ON dbo.T_WORKER.MAN_ID = dbo.T_MAN.MAN_ID LEFT OUTER JOIN
                      dbo.T_AREA ON dbo.T_WORKER.AREA_ID = dbo.T_AREA.AREA_ID LEFT OUTER JOIN
                      dbo.T_DEPARTMENT ON dbo.T_WORKER.DEPARTMENT_ID = dbo.T_DEPARTMENT.DEPARTMENT_ID LEFT OUTER JOIN
                      dbo.T_ROLE ON dbo.T_WORKER.ROLE_ID = dbo.T_ROLE.ROLE_ID
WHERE     (dbo.T_MAN.MAN_WORKER = 'False')
Выводит вроде нормально. Но в приложении есть ещё и сортировка по Филиалу/Отделу/Должности и если они не выбраны
Т.е. запрос следующий:
SELECT * FROM [dbo].[V_PERSONAL_CURRENT] WHERE [AREA_NAME] LIKE '%' AND [DEPARTMENT_NAME] LIKE '%' AND [ROLE_NAME] LIKE '%'
То запрос ничего не возвращает.
Как лучше сделать? Добавить в запрос на фильтры что-то вроде OR [AREA_MANE] IS NULL
Т.е. получится:
SELECT * FROM [dbo].[V_PERSONAL_CURRENT] WHERE ([AREA_NAME] LIKE '%' OR [AREA_NAME] IS NULL) AND
 ([DEPARTMENT_NAME] LIKE '%' OR [DEPARTMENT_NAME] IS NULL) AND 
([ROLE_NAME] LIKE '%' OR [ROLE_NAME] IS NULL)

Так, вроде, работает, но может есть вариант попроще? :)

Модератор: Тема перенесена из форума "Проектирование БД".


Сообщение было отредактировано: 13 ноя 11, 12:01
13 ноя 11, 09:11    [11588406]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
Wr
[AREA_NAME] LIKE '%' OR [AREA_NAME] IS NULL
Это всё равно, что это просто не писать!
13 ноя 11, 12:56    [11588672]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
iap
Wr
[AREA_NAME] LIKE '%' OR [AREA_NAME] IS NULL
Это всё равно, что это просто не писать!
Ещё пригляделся и вижу, что вот это
SELECT * FROM [dbo].[V_PERSONAL_CURRENT] WHERE ([AREA_NAME] LIKE '%' OR [AREA_NAME] IS NULL) AND
 ([DEPARTMENT_NAME] LIKE '%' OR [DEPARTMENT_NAME] IS NULL) AND 
([ROLE_NAME] LIKE '%' OR [ROLE_NAME] IS NULL)
можно слегка упростить:
SELECT * FROM [dbo].[V_PERSONAL_CURRENT];
13 ноя 11, 12:59    [11588682]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22550
Возможно, автор просто еще не ознакомился со следующими FAQ:
Переменное число критериев отбора в запросе
Переменное число критериев сортировки результатов
13 ноя 11, 15:33    [11588900]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Wr
Member

Откуда: Питер
Сообщений: 134
автор
можно слегка упростить:
SELECT * FROM [dbo].[V_PERSONAL_CURRENT];


LIKE '%' Появляется только если не выбран пармктр сортировки.
Как правило смотрится определённый отдел определённого филиала.
Т.е. в запросе чаще всего учавствует запись LIKE '%Отдел кадров'

Если просматривать список уволенных (или по другой причине сотрудников, не имеющих записей о филиале/оттделе/должности)
то, LIKE '%' ничего не вернёт, т.к. в талице значение NULL
15 ноя 11, 00:18    [11596622]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить