SQL查询-比较行值



好的,这是我的SQL数据库中有两个表的问题。表1是一个简单的联系人表,在我的数据库中每个人都有一个记录。表2是一个教育/考试表,其中DB中每个人都有一条记录,但每条记录中都有多个测试。我正试图查询这两个表,以获得所有过期值(比今天旧)的记录的列表,这样我就可以标记该记录以进行删除。DB中存储的所有日期都是过期日期。关键是,由于个人考试记录都存在于该记录的一行中,即使其中一个考试日期没有到期,也需要保留整个记录。只有当我有空值和过期日期的组合时,我才能删除记录。并不是每个人都有4条记录,大多数人都有一两条,其余记录为Null。下面是我获取数据的代码:

select n.id, n.FULL_NAME, e.ExamDate1, e.ExamDate2, e.ExamDate3, e.ExamDate4
from Name n inner join Education e on n.id = e.id

这给我带来了570k张唱片,它们都是混合的。结果片段如下:

|ID |全名|考试日期1 |考试日期w |考试日期3 |考试日期4 |
|10001|John Doe|2008年1月1日| Null | Null |2015年10月25日|
|10002|Jane Doe|2020年8月10日|2015年1月25日|2014年4月16日|空|
|10003|John Smith |2010年1月1日|2008年6月5日|2013年9月15日|2001年7月8日|
|10004|Debbie Sue|2020年8月14日|2016年6月5日| Null | Null |
|10005|Suzy Q |2016年5月9日|2014年4月15日|2017年4月9日|空|

我需要能够获取这些数据并对其进行排序,并标记每个人的好坏。如果至少有一个列出的日期未过期,则为好;如果所有列出的日期都已过期或所有日期都已到期,并且没有日期的记录为空,则为坏。

关于最简单的方法是什么,有什么想法吗?我在想一个案例陈述,在这个过程中,我使用每个考试日期的案例来浏览每个记录。有一个以空白开头的存储变量,并将一个值添加到该存储变量中,作为variable=variable+'X',在循环结束时,查看变量的值。如果值是yyyy,则标记(显示)该记录;如果不是,则保留该记录。循环完成后,将变量重置为空白并重新启动。

我希望这在我的脑海中是有意义的,但并不总是写在纸上。

谢谢。

Sql是一种基于集合的语言。语言本身不是用来标记好或坏的,而是用来返回一个特定的集合。在这种情况下,您可能想要一组过期的记录。您已经掌握了所有信息,因此不需要案例陈述或循环浏览数据。一般来说,您应该尽量不要在sql中循环数据。

所以,你想要的是符合以下标准的所有人的列表:考试日期1为空或过期,考试2为空或到期,考试3为空或已过期,考试4为空或过时。这些条件很好地转化为sql。

select n.id, n.FULL_NAME, e.ExamDate1, e.ExamDate2, e.ExamDate3, e.ExamDate4
from Name n inner join Education e on n.id = e.id
where (e.ExamDate1 is null or e.ExamDate1 < cast(getDate() as date))
and (e.ExamDate2 is null or e.ExamDate2 < cast(getDate() as date))
and (e.ExamDate3 is null or e.ExamDate3 < cast(getDate() as date))
and (e.ExamDate4 is null or e.ExamDate4 < cast(getDate() as date))

"好人"名单

select n.id, n.FULL_NAME, e.ExamDate1, e.ExamDate2, e.ExamDate3, e.ExamDate4
from Name n inner join Education e on n.id = e.id
where
  (
    ISNULL(e.ExamDate1,'19000101') >= GETDATE()
    or
    ISNULL(e.ExamDate2,'19000101') >= GETDATE()
    or
    ISNULL(e.ExamDate3,'19000101') >= GETDATE()
    or
    ISNULL(e.ExamDate4,'19000101') >= GETDATE()
    or
  )

标记坏人(仅在名称表中)

update n
set n.YOUR_FLAG_COLUMN = 'Y'
from Name n inner join Education e on n.id = e.id
where
  (
    ISNULL(e.ExamDate1,'19000101') < GETDATE()
    and
    ISNULL(e.ExamDate2,'19000101') < GETDATE()
    and
    ISNULL(e.ExamDate3,'19000101') < GETDATE()
    and
    ISNULL(e.ExamDate4,'19000101') < GETDATE()        
  )

或者,如果您在"姓名"one_answers"学历"之间有foregin键,则使用"级联删除",甚至删除它们。。。

相关内容

  • 没有找到相关文章

最新更新