SQL: удаление даты из внутренней инструкции SQL возвращает неверные данные

#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. Привет, Лукас. Пожалуйста, не редактируйте «решаемая» в заголовке и / или не добавляйте свое решение к вашему вопросу, пожалуйста. Вы можете ответить на свой собственный вопрос, добавив реальный ответ, и отметьте ответ, чтобы ваш вопрос отображался как «решенный». Если ответ вряд ли поможет другому пользователю, вы также можете просто удалить свой вопрос.