#sql-server
#sql-server
Вопрос:
Я пытаюсь разобраться в этом, но застрял.
Из приведенной ниже инструкции SQL, когда я запускаю инструкцию с прокомментированной датой, я получаю правильный результат. Но когда я удаляю его, оператор возвращает неверные данные; он пропускает несколько записей.
Я не понимаю, почему наличие фильтра даты и отсутствие его в инструкции, следующей за NOT IN, приводит к разным результатам. Кроме того, есть ли что-то еще, что я могу попробовать, кроме «not in»?
select
RscMaster_no_in, last_name, first_name, Wstat_Abrv_Ch,
Staffing_Calendar_Date, payhours
from
all_hire
where
Wstat_no_in in (103)
and RscMaster_no_in not in (select t2.RscMaster_no_in
from all_hire h
right join (select h.RscMaster_no_in, last_name, first_name, Staffing_Calendar_Date
from all_hire h
where rscmaster_no_in in (select rscmaster_no_in from ECC_splty)
and Wstat_Abrv_Ch <> ''
and Wstat_no_in = 107) t2 on h.RscMaster_no_in = t2.RscMaster_no_in and h.Staffing_Calendar_Date = t2.Staffing_Calendar_Date
where
h.Wstat_no_in = 103
and h.Staffing_Calendar_Date = '2020-11-01' -- this date is only for testing, and will have to be removed. The SQL statement, however, returns correct data with this filter added.
)
and Staffing_Calendar_Date = '2020-11-01'
Из приведенного ниже инструкции SQL # 1 я получаю 29 записей.
select
RscMaster_no_in, last_name, first_name, Wstat_Abrv_Ch,
Staffing_Calendar_Date, payhours
from
all_hire
where
Wstat_no_in in (103)
and
Staffing_Calendar_Date = '2020-11-01'
Из инструкции SQL # 2 ниже я получаю 2 записи.
select t2.RscMaster_no_in
from all_hire h
right join (select h.RscMaster_no_in, last_name, first_name,
Staffing_Calendar_Date
from all_hire h
where rscmaster_no_in in (select rscmaster_no_in from ECC_splty)
and Wstat_Abrv_Ch <> ''
and Wstat_no_in = 107) t2 on h.RscMaster_no_in = t2.RscMaster_no_in and
h.Staffing_Calendar_Date = t2.Staffing_Calendar_Date
where
h.Wstat_no_in = 103
and h.Staffing_Calendar_Date = '2020-11-01'
Поэтому, когда я объединяю эти две инструкции SQL, я получаю правильный результат с 27 записями. Только когда я удаляю дату из инструкции # 2, я получаю неверное количество записей — 22 записи. Я проверил записи и не увидел никаких проблем. Я просто не понимаю, почему.
Комментарии:
1. Я думаю, было бы полезно иметь пример данных, которые неправильно удалены. Кроме того, является ли RscMaster_no_in уникальным?
2. Бьюсь об заклад, что фильтр с комментариями по дате удаляет записи с нулевыми значениями из правого соединения. При ее удалении записи из t2 без совпадающего h будут иметь нулевое значение для h.Staffing_Calendar_Date и будут разрешены, при этом эти записи будут опущены.
3. @edmCoff — я добавил дополнительную информацию о своем вопросе. Надеюсь, это поможет.
4. Итак, какова цель вашего
RIGHT JOIN
?WHERE
Предложениеh.Wstat_no_in = 103 and h.Staffing_Calendar_Date = '2020-11-01'
в любом случае превращает егоINNER JOIN
в.5. Привет, Лукас. Пожалуйста, не редактируйте «решаемая» в заголовке и / или не добавляйте свое решение к вашему вопросу, пожалуйста. Вы можете ответить на свой собственный вопрос, добавив реальный ответ, и отметьте ответ, чтобы ваш вопрос отображался как «решенный». Если ответ вряд ли поможет другому пользователю, вы также можете просто удалить свой вопрос.