【问题标题】:Complex Sql Query Help. Forming query in SQL复杂的 Sql 查询帮助。在 SQL 中形成查询
【发布时间】:2009-10-14 21:39:55
【问题描述】:

我是 SQL 新手,需要编写一个复杂的查询。你能帮忙吗?

我有两张桌子。一种称为患者,另一种称为病例。 PATIENTS 有一个“患者编号”和输入的日期。 CASES 有“患者编号”、“病例编号”。和“修改日期”。这两个表与“患者编号”相关联。有多个“案例号”。与一个“患者编号”相关联,因为一名患者可以有多个病例。

我需要获取以下记录。所有“病例修改日期”早于某个日期的所有患者(来自 PATIENTS)。所以如果日期是 1999 年 6 月 20 日。那么我需要所有在 06-20-1999 之后没有修改过病例的患者

我将不胜感激。谢谢。

【问题讨论】:

  • 这是一个简单而不复杂的查询。请向我们展示你到目前为止所拥有的。我会给你一个提示,使用一个连接。
  • 不加入,HLGEM,她不想要病例,只想要病人。下面罗宾戴的解决方案是正确的。
  • 这是一个两部分的问题吗?在此日期之前从未有过病例的患者(所有日期都较早)。在此日期之后仅有病例的患者(没有更早的日期)。
  • 听起来像是典型的学校作业

标签: sql sql-server


【解决方案1】:
SELECT
    *
FROM
    Patients
WHERE
    PatientId NOT IN(
        SELECT
            PatientId
        FROM
            Cases
        WHERE
            DateModified >= '06-20-1999'
    )

【讨论】:

  • 这将返回没有病例的患者
  • 我的“假设”是查询是返回在指定日期之后没有活动的患者。因此,我认为显示没有病例的患者是正确的。不过,我的假设可能是错误的。正如我们所知……它是万物之母……
  • 你可能是对的。正如措辞“所有“病例修改日期”早于某个日期的所有患者(来自 PATIENTS)。”,是否没有病例符合条件是模棱两可的。
  • 在子查询中添加 UNION 以包含在没有病例的患者中并不难,从而排除他们。
【解决方案2】:
SELECT patient_no
FROM patients
WHERE patient_no NOT IN (
  SELECT patient_no
  FROM cases
  WHERE date_modified >= '1999-06-20'
)

但不确定该日期格式。

【讨论】:

  • 这将返回没有病例的患者
  • “那么我需要所有在 1999 年 6 月 20 日之后没有修改过病例的患者”——这句话适用于没有病例的患者。
【解决方案3】:

如果您只需要患者,并且所有病例都必须在日期之前修改,那么

Select * From Patients p
Where Exists      -- eliminates those with no cases/or no cases before date
    (Select * From cases 
     Where PatientNo = p.PatientNo
        And ModifiedDate < [DateValue])
  And Not Exists --  to eliminate patients with cases modified after date.. 
    (Select * From cases 
     Where PatientNo = p.PatientNo
        And ModifiedDate >= [DateValue])

如果您还需要案例数据,请使用连接:

Select * From Patients p 
   Join Cases c on c.PatietNo = p.PatientNo 
Where c.Modifed < DateValue

编辑:将下面@Larry 的评论中的 after 更改为 before,谢谢!

【讨论】:

  • Charles,我认为问题是要患者数据而不是病例数据。此外,所需的患者是在给定日期之前而不是之后修改所有病例的患者。
  • 我认为向用户说明此查询消除了没有任何病例的任何患者是件好事。无论如何,他们数据库中的业务规则可能会阻止这种情况。