现有一Access数据库,字段内容如下:
A(日期)    B(品种)    C(名称)    D(...)  ......
2009-5-8   pz1        m1         
2009-5-8   pz1        m2         
2009-5-8   pz2        n1         
2009-5-8   pz2        n2         
2009-5-9   pz1        m1         
2009-5-9   pz1        m2         
2009-5-9   pz2        n1         
2009-5-9   pz2        n2         
...
...日期从2000年开始至今,除了双休和节假日外每天都有数据,品种有几十个,各品种下的名称有重复的,每天每品种下的名称有一条数据,现在的数据有二十多万多。
我现在想做一个校检,检查数据的完整性,比方说数据重复、遗漏等。能提供一些思路吗?
1.数据重复,可能某天的数据重复输入。
2.数据遗漏,有可能会有某天的数据忘记输入。
3.关于双休和假期,双休能直接跳过,节假日例如春节的日期不好确定;五一前几年是7天长假,这几年是3天小假。这个,我的思路是做一个假期表,把假期确定下来,校检的时候跳过这些假期,以后的假期可以通过系统运行时手动更改。
现在麻烦的就是数据重复和遗漏,难道要每条数据都在全表里遍历一遍吗?这样用时太多。有没有什么简便的SQL语句能实现?

解决方案 »

  1.   

    1)重复
    SELECT * FROM table1 a
     WHERE EXISTS (select * from table1 b
                    where b.日期=a.日期
                         and b.品质=a.品种
                         and b.名称=a.名称
                         ...)
    2)遗漏
    先取得有数据的日期
    SELECT 日期 FROM table1
     GROUP BY 日期
     ORDER BY 日期
    遍历这个记录集,判断前后两个日期中间缺少的日期是否不是休日。
      

  2.   

    2)遗漏
    或者你将所有的工作日加到一张日历表中,就可以直接用 SQL 查询了
    SELECT * FROM 日历表 a
     WHERE NOT EXISTS (SELECT * FROM table1 b
                        WHERE b.日期=a.日期)
      

  3.   

    select * 改成select top 1 * 速度稍快些
      

  4.   

    晕,SQL还能这样用
    能解释一下吗?翻译一下。
    SELECT * FROM table1 a                     这里的“a” 就是个字符“a”吗?还是指我的A字段?
     WHERE EXISTS (select * from table1 b
                    where b.日期=a.日期
                         and b.品质=a.品种
                         and b.名称=a.名称
                         ...)SELECT 日期 FROM table1                     这句怎么理解?
     GROUP BY 日期
     ORDER BY 日期
    select top 1 *                             这样做为什么快一些?这个“1”是什么意思?
      

  5.   

    select top 1就是select 第一个,上面看漏。
      

  6.   

    a是表的别名
    top 1是指符合条件的第一个
      

  7.   

    学习了!
    学编程不学数据库就像学语文不学诗歌一样。
    这句话倒是挺真的,感觉写SQL语句,就像在写古诗...
      

  8.   

    如果是在输入时检查重复数据呢?
    select * from table1 where A=text1.text and B=text2.text and C=text3.text我是用的Flex,这里用text1作个例子,每天的数据有几百条,这样处理的话有点慢。
      

  9.   

    那你先去看下别名是怎么定义的了。
    你想叫什么就叫什么,b,c,abc,abcd都可以。。
      

  10.   

    20 万条记录不算多,算法也不算复杂。用遍历也不是不可接受。编写 SQL 是否能满足算法要求,测试过程可能比遍历时间还长。
      

  11.   

    建议先将 SQL-92 标准看一遍。