Выберите Персона без записи в Таблице 2 или записи не соответствуют критериям в Таблице 2 - PullRequest
0 голосов
/ 09 января 2019

Это связано с хранимой процедурой SQL Server, над которой я работаю.

Проблема, которую необходимо решить: Выберите запись из таблицы 1, если запись с соответствующим идентификатором не существует в таблице 2 или не соответствует ожидаемым условиям

Этот пример - то, что я пытаюсь сделать с измененными именами таблиц.

Два стола: Персона , Материал

Выберите Персона. Имя

Условия:

  1. Если нет записи материала
  2. если между «7/1/18» и «6/30/19» нет материала, а Stuff.Status не «Черновик»

Пример данных:

TABLE Person

Person.PersonID, Person.Name

1, Frank
2, Tom
3, Barb

TABLE Stuff

Stuff.StuffID, Stuff.PersonID, Stuff.CreatedDate, Stuff.Status

1, 1, '7/30/18', 'Draft'
2, 2, '8/14/18', 'Submitted'

Ожидаемые результаты запроса

1. Frank
2. Barb

Я не могу понять, как правильно обрабатывать условия, упомянутые выше, чтобы показать правильный результат. Я пытался найти ответ, соответствующий тому, что мне было нужно, но ничто не подходило точно.

~~~ Обновление с рабочим решением ~~~

С помощью Брайана и Эрика мне удалось выяснить, что я делаю неправильно. Мои условия смутили меня, заставив думать, что мне нужно несколько наборов условий.

SELECT DISTINCT Person.Name
FROM Person
WHERE NOT EXISTS
(
    SELECT 1 FROM Stuff
    WHERE
    Person.PersonID = Stuff.PersonID
    AND Stuff.CreatedDate >= '2018-07-01'
    AND Stuff.CreatedDate <= '2019-06-30'
    AND Stuff.Status <> 'Draft'
)

В основном это сделало так, что все, что не соответствовало ожидаемым критериям, было возвращено, к чему я стремился, но смутило себя в мысли, что мне нужно больше.

1 Ответ

0 голосов
/ 09 января 2019

Я думаю, что вы получите то, что вам нужно, NOT EXISTS для ваших условий.

SELECT
  p.Name
FROM
  Person AS p
WHERE
  NOT EXISTS 
(
  SELECT 1
  FROM Stuff AS s
  WHERE
    s.PersonId = p.PersonId
    AND s.CreatedDate >= '2018-07-01'
    AND s.CreatedDate <= '2019-06-30'
    AND s.Status <> 'Draft'
);

Редактировать: Я сократил ответ до кода, который работал для ОП, на основе правок к вопросу и комментариев ниже.

...