sql数据库中的两个表的记录进行比较!并将结果写入表中!

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql数据库中的两个表的记录进行比较!并将结果写入表中!相关的知识,希望对你有一定的参考价值。

sql数据库中的两个表的记录进行比较!sql数据库中有A表和B表,字段结构相同,字段名称为NO,1,2,3,4,5,6,7,8,9,10等11个字段。A,B表中的数据是有a,b,c字符组成,其中A表中的记录是由单个字符构成(即a,b,c),B表中的记录是由单个或双个或三个字符构成(如a,b,c,ab,bc,ac,abc)。现比较A,B表的记录,如果A表的数据包含在B表中,则视为相同,统计A,B表中的字段有几个相同,并将统计的结果写入A表新增加的字段中。
也就是说A表的每条记录要和B表的每条记录进行比较,假设A表的第一条记录和B表的所有的800条记录进行比较,即得出800个结果,得出的结果写入A表第一条记录的后面,包括原来A表的11个字段加上得出的结果共有11+800=811个字段了。A表的其他记录如此依次和B表的记录进行比较,就可以得出最终的结果!
或者换一种方式,即A表的所有记录依次和B表的第一条记录开始比较,就得到一个字段(字段11)的结果,写入A表中。然后在和B表的第二条记录开始比较,得到字段12的结果,写入A表中,如此类推,直到和B表的最后一条记录比较完成,得到最后一个字段811。

如A表
NO 1 2 3 4 5 6 7 8 9 10
1 a c b b c a c c b a
2 b a b c b b a b c a
3 a c a b c b b c a c
4 c c a b a b c a c b
..........
10000

B表
NO 1 2 3 4 5 6 7 8 9 10
1 bc ab bc ac abc ac ab bc ac ab
2 ac abc ab bc ac ab ab bc abc ab
3 ab bc abc ab abc ac bc ac abc ac
4 abc ab bc bc ac ab ab ab ac bc
.......
800

得到的A表结果(共有7个字段相同)
NO 1 2 3 4 5 6 7 8 9 10 11 12 13 14...810
1 a c b b c a c c b a 5 9 10 5 ...
2 b a b c b b a b c a 9 8 5 8 ...
3 a c a b c b b c a c 4 9 9 7 ...
4 c c a b a b c a c b 4 8 7 7 ...
.......
10000

解释:
A表的第一条记录和B表的前面4条记录比较后的结果为5,9,10,5 写入A表的11,12 ,13,14字段里,A表的第二条记录和B表的前面4条记录比较后的结果为9,8,5,8 写入A表的11,12 ,13,14字段里, A表的第三条记录和B表的前面4条记录比较后的结果为4,9,9,7写入A表的11,12 ,13,14字段里,A表的第二条记录和B表的前面4条记录比较后的结果为4,8,7,7 写入A表的11,12 ,13,14字段里。
或者用我说的第二个方式,先得出字段11的值,然后是字段12的值,依此类推...

A表有1万条记录,B表中有800条记录,A表中的每条记录和B表中的每条记录进行比较,A表的每条记录和B表800条记录比较后把比较结果写到A表记录新增的800条字段里进行存储。
呵呵,我也不知道行得通不,俺还是个新人,或者还有什么更好的办法?

首先说一下,楼主你这个逻辑就是错误的,不能这样随意的增加字段。
当数据库结构确定下来之后,不能随意更改的。就算更改,也不能这样大批量的动态更改。
况且并不是所有的记录都要增加相同数目的字段。加上记录多,会很慢。

还有就是sqlserver每条数据大小不得超过16K,你这个。。。。不敢想象。
数据库结构逻辑重新设计一下吧,没有这么用的,呵呵。
参考技术A 你这个放到数据库里来做?????
1W条记录跟800条记录来比就是要比800W 就要扫表B要800W 次,真的是碰到你的大头鬼哦

老实点,把数据从数据库里读出来后放程序里来处理后再写数据库
参考技术B 牛人,支持楼上的!你的机子是变形金刚啊!还是什么超级服务器啊,

得出800个结果,得出的结果写入A表第一条记录的后面,包括原来A表的11个字段加上得出的结果共有11+800=811个字段了。A表的其他记录如此依次和B表的记录进行比较,就可以得出最终的结果! 这雷人啊!你咋想的啊!

使用子查询中的动态字段将包含两个表的查询从 SQL 转换为 Linq

【中文标题】使用子查询中的动态字段将包含两个表的查询从 SQL 转换为 Linq【英文标题】:Convert a two-table exists query from SQL to Linq using dynamic fields in the subquery 【发布时间】:2011-06-07 21:36:30 【问题描述】:

我正在尝试查询旧的 Access 数据库表并将它们与 SQL Server 表进行比较。 它们通常没有主键,或者它们有在九十年代有某种用途的额外字段等,或者新表有新字段等。

我需要根据运行时指定的一组字段来查找记录,这些记录在一个表中但不在另一个表中。

所以,当我比较不同表中的数据时,我一直在 SQL 中执行这种查询:

dim fields_i_care_about as string = "field1, field2, field3" 
'This kind of thing gets set by a caller, can be any number of fields, depends on the 
'table

dim s as string= ""

dim flds = fields_i_care_about.split(",")
for i as integer = 0 to ubound(flds)
    if s > "" then s += " AND "
    s += " dysfunctional_database_table." & flds(i) & "=current_database_table." & flds(i)
next

s = "SELECT * from dysfunctional_database_table where not exists (SELECT * from current_database_table WHERE " & s & ")"

====

我正在尝试使用 Linq 来执行此操作,因为看起来两种不同数据库类型的一些数据类型问题变得不那么令人头疼了, 但我是 Linq 的新手,完全被卡住了。

我已经做到了:

将新旧表分别放入数据表中,分别为 dt1 和 dt2

 Dim new_records = _
            From new_recs In dt2.AsEnumerable
            Where Not ( _
                From old_recs In dt1.AsEnumerable Where old_recs(field1) = new_recs(field1) AndAlso old_recs(field2) = new_recs(field2)).Any
             Select new_recs

但我不知道如何将这部分即时放入 - old_recs(field1) = new_recs(field1) 还有 old_recs(field2) = new_recs(field2)

到目前为止,我已经尝试过: 将我要比较的字段放入字符串,然后将该字符串作为变量放入(我以为我可能在作弊,我想我是)

dim str = old_recs(field1) = new_recs(field1) AndAlso old_recs(field2) = new_recs(field2)

 From new_recs In dt2.AsEnumerable
            Where Not ( _
                From old_recs In dt1.AsEnumerable Where str).Any
             Select new_recs

它告诉我它不能转换布尔值 -

如果没有 Linq 表达式,有什么方法可以做到这一点?它们似乎比我在这里尝试做的复杂得多,而且它们需要大量代码,而且我似乎找不到我们在子查询中比较两个字段的表达式示例。

有没有更简单的方法?我知道我可以使用 JOIN 或 IN 执行通常的 EXISTS 查询 - 在这种情况下,我不需要查询超快或其他任何东西。而且我不需要使用 DataTable 或 DataSet - 我可以将数据放在其他类型的对象中。

【问题讨论】:

【参考方案1】:

所以我发现了很多使用 MethodInfo 和反射之类的示例代码,但我无法让它工作 - 这些 Datarows 有一个 Field 方法,但它需要你添加一个(对象)字段名称参数之前的参数,这很棘手。

所以我不确定这个解决方案是否是最有效的方法,但至少它有效。我很想知道这种方式是否有效以及为什么或为什么不有效。似乎大多数人都使用反射来做这种事情,但我无法让它正常工作,无论如何我想做的很简单,而这些方法很复杂。我想我是在用 SQL 的思维方式做 Linq,但无论如何它是有效的。

 Dim f As Func(Of DataRow, DataRow, String, Boolean) = Function(d1 As DataRow, d2 As DataRow, s As String)
                                                                  Dim fields = Split(s, ",")
                                                                  Dim results As Boolean = True
                                                              For k As Integer = 0 To UBound(fields)
                                                                  Dim obj = DataRowExtensions.Field(Of Object)(d1, fields(k))
                                                                  Dim obj2 = DataRowExtensions.Field(Of Object)(d2, fields(k))
                                                                  If obj <> obj2 Then results = False : Exit For
                                                              Next
                                                              Return results
                                                          End Function
 Dim new_records = _
        From new_recs In dt2.AsEnumerable.AsQueryable()
        Where Not ( _
            From old_recs In dt1.AsEnumerable.AsQueryable Where f(old_recs, new_recs, id_key)).Any
         Select new_recs

    Try
        Return new_records.CopyToDataTable
    Catch ex As Exception
        Stop
    End Try

【讨论】:

以上是关于sql数据库中的两个表的记录进行比较!并将结果写入表中!的主要内容,如果未能解决你的问题,请参考以下文章

SQL 中的 UNION 和UNION ALL 有啥区别?

SQL 中的 UNION 和UNION ALL 有啥区别?

将主表与另一个表中的所有记录进行比较,以得出主表的列值

Python3.7 比较两个Excel文件指定列的值的异同,并将核对结果写入Excel中

PowerShell - 从 csv 文件读取数据,比较特定列中的数据并将结果写入新文件

sql比对两个表中的差异数据比较的sql语句