返回顶部
首页 > 资讯 > 数据库 >SQL 确定两个表是否有相同的数据
  • 111
分享到

SQL 确定两个表是否有相同的数据

sql数据库mysql 2023-09-05 07:09:33 111人浏览 安东尼
摘要

描述: 想知道两个表或两个视图里是否有相同的数据(行数和值)。考虑如下所示的视图。 create view Vasselect * from emp where deptno != 10 uNIOn allse

描述:

想知道两个表或两个视图里是否有相同的数据(行数和值)。考虑如下所示的视图。

create view Vasselect * from emp where deptno != 10 uNIOn allselect * from emp where ename = 'WARD' select * from V

 我希望确定该视图是否和 EMP 表有完全相同的数据。与员工 WARD 相关的数据有两行,这表明相应的解决方案不仅要找出来不同的数据,还要找到重复的数据。根据 EMP 表的数据,二者的不同之处包括 3 行部门编号为 10 的数据以及两行员工 WARD 的数据。我希望返回如下所示的结果集。

 

方法:

使用求差集的函数(MINUS 或 EXCEPT,这取决于你使用的数据库管理系统)可以很容易地比较表中的数据。如果你所使用的数据库管理系统没有提供类似功能,则可以使用关联子查询。

DB2 和 PostgreSQL
使用集合运算 EXCEPT 和 UNioN ALL 找出视图 V 和 EMP 表的不同之处。

 1  ( 2   select empno,ename,job,mgr,hiredate,sal,comm,deptno, 3           count(*) as cnt 4     from V 5    group by empno,ename,job,mgr,hiredate,sal,comm,deptno 6   except 7   select empno,ename,job,mgr,hiredate,sal,comm,deptno, 8          count(*) as cnt 9     from emp10    group by empno,ename,job,mgr,hiredate,sal,comm,deptno11  )12    union all13  (14   select empno,ename,job,mgr,hiredate,sal,comm,deptno,15          count(*) as cnt16     from emp17    group by empno,ename,job,mgr,hiredate,sal,comm,deptno18   except19   select empno,ename,job,mgr,hiredate,sal,comm,deptno,20          count(*) as cnt21     from V22    group by empno,ename,job,mgr,hiredate,sal,comm,deptno23  )

Oracle
使用集合运算 MINUS 和 UNION ALL 找出视图 V 和 EMP 表的不同之处。

 1  ( 2   select empno,ename,job,mgr,hiredate,sal,comm,deptno, 3          count(*) as cnt 4     from V 5    group by empno,ename,job,mgr,hiredate,sal,comm,deptno 6    minus 7   select empno,ename,job,mgr,hiredate,sal,comm,deptno, 8          count(*) as cnt 9     from emp10    group by empno,ename,job,mgr,hiredate,sal,comm,deptno11  )12    union all13  (14   select empno,ename,job,mgr,hiredate,sal,comm,deptno,15          count(*) as cnt16     from emp17    group by empno,ename,job,mgr,hiredate,sal,comm,deptno18    minus19   select empno,ename,job,mgr,hiredate,sal,comm,deptno,20          count(*) as cnt21     from v22    group by empno,ename,job,mgr,hiredate,sal,comm,deptno23  )

MySQL 和 SQL Server
使用关联子查询和 UNION ALL 找出那些存在于视图 V 而不存在于 EMP 表的数据,以及存在于 EMP 表而不存在于视图 V 的数据,并将它们合并起来。

 1   select * 2     from ( 3   select e.empno,e.ename,e.job,e.mgr,e.hiredate, 4          e.sal,e.comm,e.deptno, count(*) as cnt 5     from emp e 6    group by empno,ename,job,mgr,hiredate, 7             sal,comm,deptno 8          )e 9    where not exists (10   select null11     from (12   select v.empno,v.ename,v.job,v.mgr,v.hiredate,13          v.sal,v.comm,v.deptno, count(*) as cnt14     from v15    group by empno,ename,job,mgr,hiredate,16             sal,comm,deptno17          )v18    where v.empno    = e.empno19      and v.ename    = e.ename20      and v.job      = e.job21      and v.mgr      = e.mgr22      and v.hiredate = e.hiredate23      and v.sal      = e.sal24      and v.deptno   = e.deptno25      and v.cnt      = e.cnt26      and coalesce(v.comm,0) = coalesce(e.comm,0)27   )28    union all29   select *30     from (31   select v.empno,v.ename,v.job,v.mgr,v.hiredate,32          v.sal,v.comm,v.deptno, count(*) as cnt33     from v34    group by empno,ename,job,mgr,hiredate,35             sal,comm,deptno36          )v37    where not exists (38   select null39     from (40   select e.empno,e.ename,e.job,e.mgr,e.hiredate,41          e.sal,e.comm,e.deptno, count(*) as cnt42     from emp e43    group by empno,ename,job,mgr,hiredate,44             sal,comm,deptno45          )e46    where v.empno    = e.empno47      and v.ename    = e.ename48      and v.job      = e.job49      and v.mgr      = e.mgr50      and v.hiredate = e.hiredate51      and v.sal      = e.sal52      and v.deptno   = e.deptno53      and v.cnt      = e.cnt54      and coalesce(v.comm,0) = coalesce(e.comm,0)55   )

扩展知识:

尽管使用了不同的方法,但上述解决方案的原理并无差别。
(1) 首先,找出存在于 EMP 表而不存在于视图 V 的行;
(2) 然后与存在于视图 V 而不存在于 EMP 表的行合并(UNION ALL)。
如果两个表完全相同,则不会返回任何数据。如果两个表有不同之处,那么将返回那些不同的行。在比较两个表的时候,比较容易的做法是,在比较数据之前先单独比较行数。下面是一个行数比较的简单示例,适用于所有数据库管理系统。

select count(*)  from emp unionselect count(*)  from dept

 

 因为 UNION 子句会过滤掉重复项,所以如果两个表的行数相同,则只会返回一行数据。本例中返回了两行数据,这说明两个表中没有完全相同的数据。
DB2、Oracle 和 PostgreSQL
MINUS 和 EXCEPT 的作用相同,所以这里只讨论 EXCEPTUNION ALL 前后的两个查询语句非常相似。因此,为了说明这个解决方案的原理,我们将直接执行位于 UNION ALL 前面的那个查询。执行第 1 行至第 11 行后产生的结果集如下所示。

(  select empno,ename,job,mgr,hiredate,sal,comm,deptno,         count(*) as cnt    from V   group by empno,ename,job,mgr,hiredate,sal,comm,deptno  except  select empno,ename,job,mgr,hiredate,sal,comm,deptno,         count(*) as cnt    from emp   group by empno,ename,job,mgr,hiredate,sal,comm,deptno)

 

 上述结果集显示从视图 V 中查询到了一行数据,该行数据要么不存在于 EMP 表,要么它在视图 V 中出现的次数与 EMP 表中的不一致。对于本例而言,查询找到了员工 WARD 的重复行。如果你仍然不理解该结果集是如何产生的,可以分别执行位于 EXCEPT 前后的两个查询。你会发现,两个结果集的不同之处仅仅在于视图 V 中员工 WARD 相关行的 CNT 值。
位于 UNION ALL 后面的查询语句执行了和 UNION ALL 前面的查询相反的操作。该查询找出了那些存在于 EMP 表而不存在于视图 V 的行。

(  select empno,ename,job,mgr,hiredate,sal,comm,deptno,         count(*) as cnt    from emp   group by empno,ename,job,mgr,hiredate,sal,comm,deptno   minus  select empno,ename,job,mgr,hiredate,sal,comm,deptno,         count(*) as cnt    from v   group by empno,ename,job,mgr,hiredate,sal,comm,deptno)

 上述两个结果集通过 UNION ALL 合并后即可得到最终的结果集。

 MySQL 和 SQL Server
位于 UNION ALL 前后的两个查询语句非常相似。为了理解基于子查询的解决方案,我们直接执行 UNION ALL 前面的查询。下面的查询是第 1 行至第 27 行的内容。

select *   from ( select e.empno,e.ename,e.job,e.mgr,e.hiredate,        e.sal,e.comm,e.deptno, count(*) as cnt   from emp e  group by empno,ename,job,mgr,hiredate,           sal,comm,deptno        ) e  where not exists (select null  from (select v.empno,v.ename,v.job,v.mgr,v.hiredate,       v.sal,v.comm,v.deptno, count(*) as cnt  from v group by empno,ename,job,mgr,hiredate,          sal,comm,deptno       ) v  where v.empno    = e.empno    and v.ename    = e.ename    and v.job      = e.job    and v.mgr      = e.mgr    and v.hiredate = e.hiredate    and v.sal      = e.sal    and v.deptno   = e.deptno    and v.cnt      = e.cnt    and coalesce(v.comm,0) = coalesce(e.comm,0))

 注意,这里比较的不是 EMP 表和视图 V,而是内嵌视图 E 和内嵌视图 V。计算出每一行数据出现的次数,并作为查询结果的一列返回。我们要比较每一行的数据及其出现的次数。如果你还是不理解比较操作是如何执行的,不妨单独执行两个子查询。下一步是找出存在于内嵌视图 E 而不存在于内嵌视图 V 的所有行(包括 CNT)。该操作使用了关联子查询和 NOT EXISTS。连接查询将确定哪些行是相同的,NOT EXISTS 则筛选出内嵌视图 E 中与连接查询结果不匹配的行。UNION ALL 后面的查询语句做了相反的操作,它找出了所有存在于内嵌视图 V 而不存在于内嵌视图 E 的行。

select *   from (select v.empno,v.ename,v.job,v.mgr,v.hiredate,       v.sal,v.comm,v.deptno, count(*) as cnt  from v group by empno,ename,job,mgr,hiredate,          sal,comm,deptno       ) v  where not exists (select null  from (select e.empno,e.ename,e.job,e.mgr,e.hiredate,       e.sal,e.comm,e.deptno, count(*) as cnt  from emp e group by empno,ename,job,mgr,hiredate,          sal,comm,deptno      ) e where v.empno    = e.empno   and v.ename    = e.ename   and v.job      = e.job   and v.mgr      = e.mgr   and v.hiredate = e.hiredate   and v.sal      = e.sal   and v.deptno   = e.deptno   and v.cnt      = e.cnt   and coalesce(v.comm,0) = coalesce(e.comm,0))

 

来源地址:https://blog.csdn.net/m0_67621290/article/details/128934531

您可能感兴趣的文档:

--结束END--

本文标题: SQL 确定两个表是否有相同的数据

本文链接: https://lsjlt.com/news/394839.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • SQL 确定两个表是否有相同的数据
    描述: 想知道两个表或两个视图里是否有相同的数据(行数和值)。考虑如下所示的视图。 create view Vasselect * from emp where deptno != 10 union allse...
    99+
    2023-09-05
    sql 数据库 mysql
  • php如何判断两个数组是否有相同值
    本篇内容介绍了“php如何判断两个数组是否有相同值”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!方法:1、用array_intersect(...
    99+
    2023-06-30
  • php 判断两个数组中是否有相同元素
    在 PHP 中判断两个数组是否有相同元素是一件很常见的事情,因为在实际的开发中,我们很难避免需要对数组进行比较。下面就来介绍几种判断两个数组是否有相同元素的方法。方法一:使用 array_intersect 函数array_intersec...
    99+
    2023-05-19
  • 如何用一个SQL语句去除两个表的相同数据后与第三个表相同的数据进行累计
    这篇文章主要讲解了“如何用一个SQL语句去除两个表的相同数据后与第三个表相同的数据进行累计”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何用一个SQL语句...
    99+
    2024-04-02
  • php怎么对比两个数组是否有相同元素
    对比方法:1、利用array_intersect_assoc()函数对比两个数组的键名和键值,语法“array_intersect_assoc($arr1,$arr2)”,会返回一个包含相同元素的交集数组;2、利用“==”运算符判断交集数组...
    99+
    2022-06-14
    php php数组
  • php如何对比两个数组是否有相同元素
    这篇文章主要介绍“php如何对比两个数组是否有相同元素”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“php如何对比两个数组是否有相同元素”文章能帮助大家解决问题。对比方法:1、利用array_int...
    99+
    2023-07-02
  • vlookup两个表如何匹配相同数据
    使用VLOOKUP函数可以在两个表中匹配相同的数据。VLOOKUP函数的语法如下:VLOOKUP(lookup_value, tab...
    99+
    2023-09-07
    vlookup
  • sql两个表的数据合并相加方法是什么
    在SQL中,可以使用UNION ALL和SUM函数来实现两个表的数据合并相加。1. UNION ALL:将两个表的数...
    99+
    2023-09-15
    sql
  • MS SQL Server数据库两个库之间相同数据表名内容批
    上一篇“导出记录数量对比-软件测试方法(一)”,主要介绍数据导出结果记录数量和原始正常好库的记录数量精确对比,测试软件导出少数据的相关bug。本文测试方法旨在更精确比对表记录内部数据差异,记录数量的对比只是...
    99+
    2024-04-02
  • mysql实用技巧之比较两个表是否有不同数据的方法分析
    本文实例讲述了mysql比较两个表是否有不同数据的方法。分享给大家供大家参考,具体如下: 在数据迁移中,我们经常需要比较两个表,以便在一个表中标识另一个表中没有相应记录的记录。 例如,我们有一个新的数据库,...
    99+
    2024-04-02
  • sql怎么判断表是否有数据
    可以使用以下方法来判断表是否有数据:1. 使用SELECT COUNT(*)语句统计表中的记录数,如果记录数大于0,则表示表...
    99+
    2023-09-23
    sql
  • sql如何判断表是否有数据
    在 SQL 中,有几种方法可以用来检查一个表是否包含数据。最常用的方法之一是使用 SELECT 语句配合 COUNT 函数。...
    99+
    2024-04-20
    sql
  • HashMap实现保存两个key相同的数据
    HashMap如何保存两个key相同的数据 最近一个朋友去面试了,面试官问了一个关于HashMap的问题:HashMap如何保存两个key相同的数据? 准确来说,应该是Map中如何保...
    99+
    2024-04-02
  • sql两个表数据合并的方法是什么
    在SQL中,可以使用UNION操作符将两个表的数据合并在一起。UNION操作符用于合并两个或多个SELECT...
    99+
    2024-04-10
    sql
  • Golang判断两个链表是否相交的方法详解
    目录算法题:判断2个链表相交方法一:map方法二:首尾相接法算法题:判断2个链表相交 面试中可能会问到的算法题,今天总结一下 方法一:map 步骤: 1.遍历list1,以节点为ke...
    99+
    2023-03-14
    Golang判断链表是否相交 Golang判断链表相交 Golang链表相交
  • php如何删除两个数组中相同的数据
    这篇文章给大家分享的是有关php如何删除两个数组中相同的数据的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。php删除两个数组中相同的数据的方法:首先创建一个PHP示例文件;然后定义两个有相同元素的数组;接着通过遍...
    99+
    2023-06-09
  • 是否可以有两个具有不同工作目录的不同 goroutine?
    php小编草莓回答您的问题:是的,可以有两个具有不同工作目录的不同goroutine。在Go语言中,每个goroutine都有自己的栈空间和寄存器状态,它们是独立的执行单元。因此,每个...
    99+
    2024-02-09
    go语言
  • HashMap怎么实现保存两个key相同的数据
    这篇文章主要讲解了“HashMap怎么实现保存两个key相同的数据”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“HashMap怎么实现保存两个key相同的数据”吧!HashMap如何保存两个...
    99+
    2023-06-20
  • oracle怎么查询两个表不同的数据
    在Oracle中,可以使用以下几种方式来查询两个表不同的数据:1. 使用MINUS运算符:```sqlSELECT colu...
    99+
    2023-08-31
    oracle
  • 【Java SE】判断两个文件内容是否相同的多种方法
    文章目录 1. 逐字节比较2. 文件摘要(哈希值)比较3. FileChannel4. 文件元数据比较5. Apache Commons IO 库6. Hutool 库 1. 逐字节比较 ...
    99+
    2023-09-28
    java java se IO 算法
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作