在Sqlite3中查找表条目之间的差异

时间:2014-05-29 14:39:30

标签: database sqlite

我有一个表,其中包含一堆服务器的主机系统信息。每个月,脚本都会使用新的输入日期向表中添加主机和系统信息。同一服务器可能有多个条目,每个条目都有不同的条目。我想要做的是使用查询来查找差异,而不是必须提取数据并以编程方式进行处理。我有两个主要问题:

  1. 查找在数据输入日期之间添加和删除的主机名。每个月都有一些服务器是新的,有些服务器与上个月相比已经不见了。我如何找到这些主机名?
  2. 有时某些值会在输入日期之间更改主机数据,安装的Java版本就是一个示例。我可以查询某个值在输入日期之间发生变化的行吗?
  3. 表名是hostdata,包含字段:hostname TEXT,os TEXT,javaversions TEXT,entrydate TEXT

1 个答案:

答案 0 :(得分:2)

  1. 您可以将EXISTS与子查询一起使用。这将返回新的主机:

    SELECT *
    FROM hostdata
    WHERE entrydate = 'thismonth'
      AND NOT EXISTS (SELECT 1
                      FROM hostdata AS last
                      WHERE entrydate = 'lastmonth'
                        AND last.hostname = hostdata.hostname)
    

    (要删除主机,请交换月份值。)

    但是,使用compound query可能更简单:

    SELECT hostname
    FROM hostdata
    WHERE entrydate = 'thismonth'
    EXCEPT
    SELECT hostname
    FROM hostdata
    WHERE entrydate = 'lastmonth'
    
  2. 这通常是通过将表连接到自身来完成的,即将上个月的数据与本月的数据相结合:

    SELECT last.hostname,
           last.os,
           last.javaversions,
           this.javaversions
    FROM hostdata AS last
    JOIN hostdata AS this ON last.entrydate = 'lastmonth'
                         AND this.entrydate = 'thismonth'
                         AND last.hostname = this.hostname
    WHERE last.javaversions <> this.javaversions