繁体   English   中英

SQL查询-比较行值

[英]SQL Query - compare row values

好的,这就是问题所在,我的SQL DB中有两个表。 表1是一个简单的联系表,其中包含我数据库中每个人的记录。 表2是一个教育/考试表,其中数据库中每个人都有一个记录,但是每个记录中都有多个测试。 我正在尝试查询两个表,以获取具有过期值(比今天更旧)的所有记录的列表,以便我可以将记录标记为删除。 数据库中存储的所有日期均为过期日期。 更重要的是,由于单个考试记录的所有记录都存在于该记录的一行中,因此,即使其中一个考试日期都没有过期,也需要保留整个记录。 如果我具有空值和过期日期的组合,则只能删除一条记录。 并非每个人都有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

这使我获得了57,000条记录,而且它们都是混合的。 结果片段如下所示:

| ID | 全名| ExamDate1 | ExamDatew | ExamDate3 | ExamDate4 |
| 10001 | 约翰·杜 1/1/2008 | 空| 空| 2015年10月25日|
| 10002 | 简·杜 2020年10月8日| 2015年1月25日| 2014年4月16日| 空|
| 10003 | 约翰·史密斯| 1/1/2010 | 6/5/2008 | 9/15/2013 | 2001年7月8日|
| 10004 | 黛比·苏(Debbie Sue) 2020年8月14日| 2016年6月5日| 空| 空|
| 10005 | Suzy Q | 5/9/2016 | 2014年4月15日| 4/9/2017 | 空|

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

关于最简单的方法有什么想法吗? 我在考虑一个过程中的案例陈述,在该过程中,我使用每个考试日期的案例来遍历每个记录。 拥有一个以空白开头的存储变量,并向该存储变量添加一个值,即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()        
  )

或者,如果您在名称和教育之间有预想的键,并且进行了级联删除,甚至将其删除...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM