Sql 如何比较两个独立需求的值,但不使用内部循环?

Sql 如何比较两个独立需求的值,但不使用内部循环?,sql,csv,coldfusion,cfquery,cfhttp,Sql,Csv,Coldfusion,Cfquery,Cfhttp,我正在做我的项目,我必须比较DB中的值和.csv文件中的值。我使用“cfhttp”将我的.csv转换为查询,然后循环该查询和另一个用于从DB获取值的查询。在这两个循环中,我使用if语句来比较我的值并检查它们是否匹配。然后我将它们存储在列表中,并在cfquery标记中使用这些列表进行更新。我在DB中有14k条记录,在.csv文件中记录的数量大致相同。我当前的代码用不到2分钟的时间将列表中的记录输出到屏幕上进行测试。我仍然没有测试更新需要多长时间。在我运行我的更新之前,我想看看你们中是否有人会为我的

我正在做我的项目,我必须比较DB中的值和.csv文件中的值。我使用“cfhttp”将我的.csv转换为查询,然后循环该查询和另一个用于从DB获取值的查询。在这两个循环中,我使用if语句来比较我的值并检查它们是否匹配。然后我将它们存储在列表中,并在cfquery标记中使用这些列表进行更新。我在DB中有14k条记录,在.csv文件中记录的数量大致相同。我当前的代码用不到2分钟的时间将列表中的记录输出到屏幕上进行测试。我仍然没有测试更新需要多长时间。在我运行我的更新之前,我想看看你们中是否有人会为我的项目推荐任何其他方法?我是否可以将执行时间减少到目前的水平?以下是我的代码:

<cfhttp name="records" columns="A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X" method="get" url="http://path to csv/temp.csv"/>

<cfquery name="getRecords" datasource="test">
    Select s.ID, f.URID, s.UR_NUMBER, CODE, f.FIELD
    From USERS s
    Left Outer Join MAPS f
    ON s.ID = f.URID
</cfquery>  

<cfset NumA = "">
<cfset NumB = "">
<cfset NumC = "">

<cfset NumD = "">
<cfset NumE = "">
<cfset updNumD = "">
<cfset updNumE = "">

<cfloop query="records">
    <cfloop query="getRecords">
        <cfif records.A EQ getRecords.UR_NUMBER>
            <cfif records.W NEQ getRecords.CODE>
                <cfif records.W EQ 'A'>
                    <cfset NumA = ListAppend(NumA,"#records.A#")>   
                <cfelseif records.W EQ 'B'>
                    <cfset NumB = ListAppend(NumB,"#records.A#")>
                <cfelse>
                    <cfset NumC = ListAppend(NumC,"#records.A#")>
                </cfif>
            </cfif>

            <cfif getRecords.URID EQ ''>
                <cfif records.W EQ 'D'>
                    <cfset NumD = ListAppend(NumD, "#getRecords.ID#")>
                <cfelseif records.W EQ 'E'>
                    <cfset NumE = ListAppend(NumE, "#getRecords.ID#")>
                </cfif>
            <cfelse>
                <cfif records.W EQ 'E'>
                    <cfset updNumD = ListAppend(updNumD, "#getRecords.URID#")>
                <cfelseif records.W EQ 'D'>
                    <cfset updNumE = ListAppend(updNumE, "#getRecords.URID#")>
                </cfif>
            </cfif> 
        </cfif>
    </cfloop>
</cfloop>
在这里,我将列表转储到屏幕上:

<cfdump var="#NumA#">
<cfdump var="#NumB#">
<cfdump var="#NumC#">
<br>
<cfdump var="#NumE#">
<cfdump var="#NumD#">
<br>
<cfdump var="#updNumE#">
<cfdump var="#updNumD#">

我还想知道是否有可能从我的.csv文件中获得我需要的cfhttp标记列?现在,即使我只使用了A列和W列中的两列,我也要对.csv中的所有列进行加密。是否可以将“cfhttp”中的查询与我的DB中的查询连接起来?如果有人能给我一些关于这个项目的建议,请让我知道

所以我认为您只对records.A等于getRecords.uru NUMBER的数据感兴趣。您可以使用查询查询来获取两个数据集的交集。比如:

<cfquery name="intersection" dbtype="query">
  select *
  from records, getRecords
  where records.A = getRecords.UR_NUMBER
</cfquery>
这将为您提供组合的数据集,然后您可以循环使用这些数据集并建立列表。正如Matt Busche在评论中提到的,列表操作很慢,因此arrayAppend会更快

如果查询或查询速度太慢,则可能需要考虑将其中一个记录集转换为键值对结构,因为查找速度更快。例如:

<cfscript>
// convert to structs as key lookups are fast
dbData = {};
for (row in getRecords) {
    dbData[row.UR_NUMBER] = row;
}

csvData = {};
for (row in records) {
    if (structKeyExists(dbData, row.A)) {
        // we have a match, so build the lists here...
        writeDump(dbData[row.A]);
    }
}
</cfscript>

cflib.org有两个功能可能会有所帮助。ListCompare告诉您一个列表中的内容,而不是另一个列表中的内容。ListAnd告诉您两个列表中的内容。对于14K记录,这可能是一种比查询更好的方法。使用arrayAppend而不是listAppend将大大加快处理速度。如果需要将arrayToList作为列表输出,可以使用它。你也可以把引号放在你使用它们的地方。i、 e.getRecords.ID可以是getRecords。ID@MattBusche为什么我要先存储在数组中,然后将其转换为列表?这将在我的页面的整个过程中花费更多的时间。此外,我使用列表是因为我可以将它们放在特定字段的justrunupdate中的WHERE子句中。这不会花费更多时间。每次将项目附加到列表时,它都必须在内存中创建一个新字符串并删除现有字符串。它比你想象的资源密集得多。arrayToList几乎不需要处理时间。这样至少可以节省95%的处理时间。有关arrayI对查询的查询有疑问的列表,请参见800ms中的此示例。我以前从未使用过它们,我很困惑在我的cfquery标记中应该为我的数据源使用什么?因为.csv文件不是来自我在第二次查询中提取记录的同一个数据库。上面的示例只查询了dbtype。我可以在代码中使用相同的东西吗?谢谢你的帮助。我还得到了这个错误:执行=。不兼容类型比较异常:比较器运算符的左侧和右侧=具有不兼容的类型。左侧表达式类型=VARCHAR。右侧表达式类型=DOUBLE。如果您处理的是14条记录而不是14000条记录,这将是一个很好的答案。@user3023588您可以使用cast使数据类型匹配。例如,CASTgetRecords.UR_编号为VARCHAR。正如@Dan Bracuk提到的,您必须试用它,看看它对您的数据集的性能有多好。@JohnWhish我尝试了Quires查询,这需要大约8分钟的时间,甚至比我当前使用内部循环的代码效率更低。所以我想知道是否将所有内容都放在srtuck中,然后循环遍历文件并与来自struct的键进行比较是更好的选择?