选择表2中没有记录的人或记录与表2中的条件不匹配

时间:2019-01-08 22:23:03

标签: sql-server select stored-procedures

这与我正在处理的SQL Server存储过程有关。

要解决的问题:当表2中不存在具有匹配ID的记录或不满足预期条件时,请从表1中选择一条记录。

此示例是我试图更改表名的方法。

两个表:资料

选择人名。

条件:

  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

我不知道如何正确处理上述条件以显示正确的结果。我试图找到一个与我需要的答案相符的答案,但似乎没有一个完全合适的答案。

~~~更新工作解决方案~~~

在Brian和Eric的帮助下,我能够发现自己做错了什么。我的条件使我困惑,以为我需要多套条件。

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 :(得分:2)

我认为这可以满足您的要求,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'
);

编辑:我根据下面对问题和评论的修改,将答案缩小为适用于OP的代码。