【问题标题】:Coldfusion Compare Two Query Results from Same DatabaseColdfusion 比较来自同一数据库的两个查询结果
【发布时间】:2014-11-11 18:28:05
【问题描述】:

我已针对我遇到的问题在此站点上进行了一些研究,但是,我发现解决方案并不完全符合我的要求,或者实施与我的目标无关'我试图做。或者,简单地说,我似乎无法弄清楚。这是我的问题。

我们每月都会运行一个查询,我们会将其发送给第三方的医生、他们的学位、专业和诊所。我已经建立了查询。但最近他们想让我们从前几个月的数据中导出新结果,而不是整个结果列表。所以,我想我会创建一个工具,我会从简单地导入前几个月的数据开始。然后获取我一直在使用的查询,将它放在一个coldfusion页面中,运行它,它会显示我们当前所在月份到上个月运行的新记录。当我每个月运行新数据的报告时,它会将该数据保存在数据库中,其中包含 r_month 和 r_year 列,这只是表示报告月/年。因此,为了最初填充数据库,我刚刚导入了 10 月的数据,这样我就可以有一个 r_month/year 分别为“10”和“2014”的基础。有 674 条记录。然后创建了我的页面并有一个按钮可以运行相同的查询,保存这些结果,r_month 和 r_year 分别保存为“11”和“2014”。当我这样做时,我有 682 条记录。因此,对于 11 月份,与上个月(10 月份)相比,有 8 条“不同”或新记录。我的问题是,运行从 10 月 (10/2014) 获取数据并将其与 11 月数据 (11/2014) 进行比较的查询的最佳方法是什么,只需给我 11 月新的 8 条记录.

抱歉,这很长,但想给你们一个详细信息,以便您获得尽可能多的信息。我真的没有可以提供的代码示例,因为显然我之前尝试的方式(使用循环等)只是行不通。尝试遍历上月查询和当前月查询,试图找出差异,但这不起作用。再一次,我尝试使用我在这里找到的类似样本,但它们不是我要找的,或者我就是想不通。基本上在流程结束时,需要一个按钮,仅将新记录(在本例中为 8)导出到 Excel 工作表中,我们可以简单地通过电子邮件发送它们。

任何帮助将不胜感激。

【问题讨论】:

  • 您真的需要单独的表吗?为什么不添加某种时间戳列来指示记录上次更新的时间?然后只需过滤 WHERE LastUpdated >= {startOfThisMonth} AND LastUpdated

标签: sql-server coldfusion compare


【解决方案1】:

解决方案 1 - 由于您使用的是 SQL 服务器,因此您可以在查询中轻松完成此操作。您已经记录了以前的数据,因此您可能在日志表中有一个“老”医生的密钥。试试这样的:

<cfquery name="getNewPHys" datasource="#dsn#">
SELECT   * 
FROM     sourceTable 
WHERE    physID NOT IN 
         (SELECT physID FROM logtable 
          WHERE  daterange between #somerange# AND #someotherrange#)
</cfquery>

您必须添加自己的值和变量,但您明白了。

注意:这是伪代码。您当然会为您的任何变量使用 cfqueryparam。

解决方案 2 另一种方法是使用 date added 或 lastUPdated 表。每次更新一行时,您都会使用当前日期/时间更新 lastupdated 列。然后选择最近的记录就是选择在您的范围内已更新的任何记录。这就是 Leigh 在她的评论中所建议的。

我会添加另一条评论。您似乎试图在不更改数据表中的任何内容的情况下解决此问题。那是行不通的。您需要多考虑一下您的架构。例如,解决方案 2 将涉及添加一个额外的列,您甚至可以添加一个 MSSQL 触发器,该触发器会在更新记录时自动更新该字段。那不行吗?

我仍然认为我们缺少一些东西。您是否每次都覆盖您的数据?或者产生 duplicate 记录 - 本月 674 条,下个月 682 条重复?如果是这样,那就是你需要纠正的。其他任何事情都将成为解决方案的螺栓,在未来会产生更多个问题。

【讨论】:

  • 约书亚 - 对过早的帖子感到抱歉 - 不小心点击了保存按钮 :)
  • 真丢脸,马克! CFQueryParam!
  • Not in 查询简单直观。他们也往往很慢。像“where somefield in (select somefield from where I want it, except select somefield from where I didn't want it)”之类的东西通常更快。
  • 马克,感谢您的帮助。但是,所有数据都在 1 个表中,并由 r_month/r_year 列分隔。没有类型的physid。我想逐列或几乎逐行进行比较,并输出哪个与新查询与旧查询不同。这有意义吗?我了解您的示例所显示的内容,但我假设该示例使用了 2 个不同的表?这一切都在一张桌子上。基础数据(10 月)以及我运行的查询中 11 月的数据都在那里。让我知道这是否有意义。
  • 好吧,如果这对您有用,您可以从子选择中的原始表中进行选择,并根据您的喜好制作 WHERE 子句。但是,如果没有一些真实数据,很难在这里为您提供建议。此外,您的表应该有某种类型的主键(这是我用 physid 表示的 - 你没有定义 PK 吗?)。我将用另外 2 种可能性编辑我的回复。
【解决方案2】:

第 1 步 - 将 computed column 添加到您的表中。确保您保留数据,以便您可以索引它。计算结果应为 2014 年 1 月的“201401”等值。我们称该列为 YearMonth

那么您的代码和查询如下所示:

ControlYearMonth = "201410";  // October 2014

<cfquery>
select field1, field2, etc
from yourtable
where YearMonth = <cfqueryparam value="#ControlYearMonth#">
except
select field1, field2, etc
from yourtable
where YearMonth < <cfqueryparam value="#ControlYearMonth#">
<cfquery>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-30
    • 2018-04-12
    • 2022-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多