基于SQLServer中如何比较两个表的各组数据图解说明

说实话,当我遇到这种SQL需求的时候,当时我就很困惑。
两个表的结构相同,但数据不同。
有必要找到完全相似的群体。
这件事仔细想想还是蛮有趣的。

比如你提到的例子,table_left和table_right各有多组数据,需要比较groupId完全一致的情况。
如图1 所示,你实际上可以找到完全重叠的两个组,比如组1 1 但关键是你在代码中如何实现这个判断。
我得详细说说我的理解和操作。

说实话,直接比较肯定不行。
两个表的结构是一样的,但是数据量大的时候速度慢得离谱。
我想了想,使用集合论是正确的想法,但是直接使用像“Except”这样的集合运算符在SQL中有点不舒服。
比如你提到的方法2 ,使用Except两次来判断两组数据是否完全相同是正确的。
但在实际操作中,如果你输入的数据量大一点,查询时间就会缩短。

当时我尝试了方法2 ,其实比方法1 要快。
方法1 必须先更新dataPath字段,并组装每组的数据,这需要多两个步骤。
随着数据量的增加,序列和更新的开销变得太大。
而且正如你所说,如果dataPath列中的数据太大(超过9 00字节),则无法建立索引。
这简直就是一个障碍。
我在上一个项目中遇到了这个陷阱。
如果某个字段超过9 00字节,则索引创建失败,后续查询会卡住。

所以我觉得方法2 比较实用。
虽然写起来比方法1 复杂一些,但是性能上明显更胜一筹。
此外,还可以扩展方法2 比如你现在的数据列太多,或者列数据特别长,你只需要给字段添加哈希索引即可。
您提到的示例是在 dataSub1 和 dataSub2 上创建哈希索引,然后使用校验和字段将它们关联起来。
这是个好主意。
我之前也用过类似的方法,使用哈希值关联实际上可以加快大量数据的比较速度。

说实话,这件事没有绝对最优的解决方案。
方法1 很直观,但实际用途太有限。
方法2 虽然写起来比较麻烦,但是通用性更强。
另外,SQL常常需要根据实际的数据量和表结构进行调整。
在我的上一个项目中,表结构略有变化,并且必须重写以前运行速度非常快的查询。

总之,只有多尝试、多比较,才能找到最适合自己场景的方法。
您提到的扩展想法,例如使用哈希索引,确实是一个好主意。
但实际使用情况取决于数据量。
当数据量特别大时,可能需要考虑批处理或者使用临时表。
这件事,真的要自己去做,跑很多遍,才知道最好的办法。

sql按字段分组,并且找出每组的第一条数据

ok 这是关于 SQL Server 和 Oracle 的问题。

SQL Server-
sql 选择一周中的某一天;信件 从 ( 选择 id asrank() OVER(按周按节按字母 DESC 排序); 星期几字母 从表中 ) AS t1 其中 id = 1
Oracle-
Oracle和SQL Server的查询语句在语法上非常相似,可以直接使用上述SQL Server的查询语句在Oracle中执行。

sql 选择一周中的某一天;信件 从 ( 选择 RANK() OVER(每周按字母 DESC 排序的部分)AS id; 星期几字母 从表中 ) AS t1 其中 id = 1
对于第二个问题,以下是SQL Server和Oracle的实现:
SQL Server:
sql 选择一周中的某一天;最大字符数为 MAX(characters)。
从表中 按周分组
Oracle-sql 选择一周中的某一天;最大字符数为 MAX(characters)。
从表中 按周分组
这两个查询语句在SQL Server和Oracle中的结果是相同的。
它们将按周分组,并且每周将选择具有最大字母的记录。

sqlserver 使用ROW NUMBER (order by xxx),此语句中的 “ OVER “

ROWNUMBER 使用 OVER 来定义范围。
SORT BY 排序列。
按块划分。