一尘不染

SQL子关系查询帮助

sql

我有一个一对多的关系,看起来像这样:

| Parent |  | Child  |
|   id   |  |   id   |
|        |  |parentID|
|        |  |  date  |

我正在尝试构造一个查询,以使我得到所有拥有孩子记录的父母,这些孩子记录的所有日期都在指定日期之前。

像这样

SELECT * FROM parent
JOIN child on child.parentid = parent.id
WHERE child.date <= '10/13/2010'

但这是一个问题,当我只希望孩子的父母的日期早于给定日期时,我得到的父母的孩子的日期早于指定日期,而孩子记录的日期早于指定日期。

有人对如何处理此案有任何建议吗?

谢谢!


阅读 106

收藏
2021-05-16

共1个答案

一尘不染

使用:

SELECT p.*
  FROM PARENT p
 WHERE EXISTS(SELECT NULL
                FROM CHILD c
               WHERE c.parentid = p.id
                 AND c.date <= '2010-10-13')
   AND NOT EXISTS(SELECT NULL
                    FROM CHILD c
                   WHERE c.parentid = p.id
                     AND c.date > '2010-10-13')

每个人都会告诉你使用连接“因为他们更快”,但它们通常是不知道的影响, 利用 他们-
如果你不需要从支持表中的信息,你不应该加入到它。这是因为在这种情况下,不止一个孩子会产生重复的PARENT记录。JOIN和DISTINCT或GROUP
BY与IN或EXISTS之间的折衷可能是同等的,但不会有适当处理重复数据的麻烦。

2021-05-16