Когда вы обнаружите, что хотите ограничить строки условием, включающим несколько строк (например, «Я хочу каждый тест, в котором ни один из нескольких результатов не был введен этим человеком»), вы не можете сделать это с простыми условиями, такими как RESULT.ENTERED_BY<>[Enter Name]
. Это касается только значения каждой строки, с которой вы в данный момент работаете. Вам нужен коррелированный подзапрос или аналитическая функция. Я думаю, что подзапросы легче начинать, и в вашем случае предложение NOT EXISTS
имеет интуитивный смысл.
(я также собираюсь переписать это с использованием стандартного современного синтаксиса JOIN)
select SAMPLE.SAMPLE_NUMBER, SAMPLE.TEXT_ID, SAMPLE.STATUS, SAMPLE.DATE_COMPLETED, SAMPLE.LOCATION, TEST.ANALYSIS, RESULT.ENTERED_BY
from DATABASE.SAMPLE SAMPLE
join DATABASE.TEST TEST
on TEST.SAMPLE_NUMBER = SAMPLE.SAMPLE_NUMBER
join DATABASE.RESULT RESULT
on RESULT.TEST_NUMBER = TEST.TEST_NUMBER
where (TEST.ANALYSIS in ('ID_META','ID_RIBO','ID_BACTERIA','ID_MOULD')
and (SAMPLE.STATUS='C') and (SAMPLE.DATE_COMPLETED Is Not Null)
and (RESULT.ENTERED_ON Between [Start Date] And [End Date])
-- up until here, it's the same as your query
and NOT EXISTS (select 1
from DATABASE.TEST T2
join DATABASE.RESULT R2
on R2.TEST_NUMBER = T2.TEST_NUMBER
where T2.SAMPLE_NUMBER = SAMPLE.SAMPLE_NUMBER
and T2.ANALYSIS in ('ID_META','ID_RIBO','ID_BACTERIA','ID_MOULD')
and R2.ENTERED_ON Between [Start Date] And [End Date]
and R2.ENTERED_BY = [Enter Name])
ORDER BY SAMPLE.DATE_COMPLETED;
Итак, здесь мы говорим, чтобы вернуть все образцы, где «не существует» ни одного теста с любым результатом, который был введен указанным c человеком. (Я не уверен, что вам понадобится фильтр даты как для основного запроса, так и для подзапроса - и RESULT, и R2 - вам придется выяснить это на основе ваших данных.)
Редактировать: если вы хотите одну строку на выборку, просто удалите соединения TEST / RESULT из основного запроса:
select SAMPLE.SAMPLE_NUMBER, SAMPLE.TEXT_ID, SAMPLE.STATUS, SAMPLE.DATE_COMPLETED, SAMPLE.LOCATION
from DATABASE.SAMPLE SAMPLE
where (SAMPLE.STATUS='C') and (SAMPLE.DATE_COMPLETED Is Not Null)
and NOT EXISTS (select 1
from DATABASE.TEST T2
join DATABASE.RESULT R2
on R2.TEST_NUMBER = T2.TEST_NUMBER
where T2.SAMPLE_NUMBER = SAMPLE.SAMPLE_NUMBER
and T2.ANALYSIS in ('ID_META','ID_RIBO','ID_BACTERIA','ID_MOULD')
and R2.ENTERED_ON Between [Start Date] And [End Date]
and R2.ENTERED_BY = [Enter Name])
ORDER BY SAMPLE.DATE_COMPLETED;