两个表找不同记录

snowvan 2008-12-03 02:28:43
两个表 A B
B表中数据是从A中来的
两个表结构一样 都有13列,其中ID列不会不变动 表中有一列bds数据类型是text
现在A表中某一行的某一列的数据变化 要找出B表中每一行数据与A中每一行数据不相同的记录!
请高人指点!

...全文
449 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
oulin1983 2008-12-03
  • 打赏
  • 举报
回复
EXCEPT 运算符
EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。当 ALL 随 EXCEPT 一起使用时 (EXCEPT ALL),不消除重复行。
select b.1 from b except select a.1 from a
一品梅 2008-12-03
  • 打赏
  • 举报
回复
还是比较深奥,呜呜,先强记一下下。
一品梅 2008-12-03
  • 打赏
  • 举报
回复
谢谢:)
如果两个列表的相应元素具有相同类型且"相等",则在任何两个表达式列表上应用的 CHECKSUM 将返回同一值。这种定义的目的在于:给定类型的 NULL 值被作为"相等"进行比较。如果表达式列表中的某个值发生变化,那么列表的校验值通常也会变化。但只在极少数情况下,校验值会保持不变。
ChinaITOldMan 2008-12-03
  • 打赏
  • 举报
回复
select * from tb where checksum(*) not in(select checksum(*) from ta)
dawugui 2008-12-03
  • 打赏
  • 举报
回复
CHECKSUM
返回在表的行上或在表达式列表上计算的校验值。CHECKSUM 用于生成哈希索引。

语法
CHECKSUM ( * | expression [ ,...n ] )

参数
*

指定在表的所有列上进行计算。如果有任一列是非可比数据类型,则 CHECKSUM 返回错误。不可比数据类型是 text、ntext、image、cursor 以及基本类型为前 4 个数据类型之一的 sql_variant。

expression

是除非可比数据类型之外的任何类型的表达式。

返回类型
int

注释
CHECKSUM 在其参数列表上计算一个称为校验值的哈希值。此哈希值用于生成哈希索引。如果 CHECKSUM 的参数是列,且在计算的 CHECKSUM 值上生成索引,则其结果是可用于在列上等价搜索的哈希索引。

CHECKSUM 满足哈希函数的下列属性:在使用等于 (=) 运算符比较时,如果两个列表的相应元素具有相同类型且"相等",则在任何两个表达式列表上应用的 CHECKSUM 将返回同一值。这种定义的目的在于:给定类型的 NULL 值被作为"相等"进行比较。如果表达式列表中的某个值发生变化,那么列表的校验值通常也会变化。但只在极少数情况下,校验值会保持不变。

BINARY_CHECKSUM 和 CHECKSUM 具有相似的功能:它们可用于计算表达式列表上的校验值,且表达式的顺序将影响结果值。在 CHECKSUM(*) 中使用的列顺序是在表或视图定义中指定的列顺序,包括计算列。

CHECKSUM 和 BINARY_CHECKSUM 仅为字符串数据类型返回不同的值,这类字符串的区域设置可能导致具有不同表示法的字符串进行等值比较。字符串数据类型是 char、varchar、nchar、nvarchar 或 sql_variant(如果其基本类型是字符串数据类型)。例如,字符串"McCavity"和"Mccavity"的 BINARY_CHECKSUM 值不同。反之,在不区分大小写的服务器中,上述字符串的 CHECKSUM 返回相同的校验值。CHECKSUM 值不应与 BINARY_CHECKSUM 值进行比较。

示例
使用 CHECKSUM 生成哈希索引
CHECKSUM 函数可以用于生成哈希索引。通过将计算校验值列添加到索引的表中,然后在校验值列上生成索引来生成哈希索引。

-- Create a checksum index.
SET ARITHABORT ON
USE Northwind
GO
ALTER TABLE Products
ADD cs_Pname AS checksum(ProductName)
CREATE INDEX Pname_index ON Products (cs_Pname)

校验值索引可用作哈希索引,尤其是当要索引的列为较长的字符列时可以提高索引速度。校验值索引可用于等价搜索。

/*Use the index in a SELECT query. Add a second search
condition to catch stray cases where checksums match,
but the values are not identical.*/
SELECT *
FROM Products
WHERE checksum(N'Vegie-spread') = cs_Pname
AND ProductName = N'Vegie-spread'

在计算列上创建的索引将具体化为校验值列,对 ProductName 值所做的任何更改将传播到校验值列。索引也可以直接建立在索引的列上。然而,如果键值较长,则很可能不执行校验值索引甚至常规索引。

一品梅 2008-12-03
  • 打赏
  • 举报
回复
checksum能解释一下吗,以及其一般用法。
jinjazz 2008-12-03
  • 打赏
  • 举报
回复
checksum(....)
括号里面把要的列都写上,一般不会去比较text这种类型的
dawugui 2008-12-03
  • 打赏
  • 举报
回复
如果要算bds(text)这列,先转换为varchar

select * from (select id , ..., cast(bds as varchar) from a) m where checksum(*) not in (select checksum(*) from (select id , ..., cast(bds as varchar) from a) n )
csdyyr 2008-12-03
  • 打赏
  • 举报
回复
学习
dawugui 2008-12-03
  • 打赏
  • 举报
回复
--前提:表中不能有text、ntext、image、cursor 数据类型的字段。

用CheckSum()最简单:

select * from A where checksum(*) not in (select checksum(*) from B)
dawugui 2008-12-03
  • 打赏
  • 举报
回复
[Quote=引用楼主 snowvan 的帖子:]
两个表 A B
B表中数据是从A中来的
两个表结构一样 都有13列,其中ID列不会不变动 表中有一列bds数据类型是text
现在A表中某一行的某一列的数据变化 要找出B表中每一行数据与A中每一行数据不相同的记录!
请高人指点!
[/Quote]
不算bds(text)这列,可以使用checksum()
水族杰纶 2008-12-03
  • 打赏
  • 举报
回复
select * from tb where checksum(*) not in(select checksum(*) from ta)

34,594

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧