今天在QQ群里,有朋友问我这样的一个SQL Server中查询数据的问题,
表 A:
num       unit
001        a
002        b
003        c

表 B:
num      unit
001        d

查询显示结果
001     d
002     b
003     c

怎么实现?

看了这个问题第一感觉是,有点难度。
不过要表达的意思很明白:匹配的显示b,不匹配显示a.

问题来了,简单的SQL语句中无法找到这样的查询方式能完成这项工作,不回答别人吧,又难受。说不会,显得很没面子。怎么办呢?

于是以最短的时间分析了下,发现我可以分成两个查询两完成工作。
即:SELECT a.num, b.unit
FROM a INNER JOIN
      b ON a.num = b.num

SELECT DISTINCT a.num, a.unit
FROM a WHERE a.num NOT IN
          (SELECT b.num
         FROM b)
而清楚的记得union可以将两个集合合并,只要集合的字段数目和类型是一样的。
那就好办,于是写下:
SELECT a.num, b.unit
FROM a INNER JOIN
      b ON a.num = b.num
UNION
SELECT DISTINCT a.num, a.unit
FROM a WHERE a.num NOT IN
          (SELECT b.num
         FROM b)

测试执行,搞定。

如果字段多,写起来麻烦,想使用*,则部分数据冗余的写法是:
SELECT a.*, b.unit AS extend
FROM a INNER JOIN
      b ON a.num = b.num
UNION
SELECT DISTINCT a.*, a.unit AS extend
FROM a WHERE a.num NOT IN
          (SELECT b.num
         FROM b)

本以为问题就这样解决了,但问题又来了,原因是这对单个字段是唯一键或主键时有效,如果唯一键是两个或两个以上的字段组成就不行了。

表 A:
num    num2   unit
001       a      a
002       b      b
003       c      c

表 B:
num   num2   unit
001      a        d

查询显示结果
num num1 unit
001    a   d
002    b   b
003    c   c

于是改写成
SELECT a.*, b.unit AS extend
FROM a INNER JOIN
      b ON a.num = b.num and a.num1 = b.num1
UNION
SELECT DISTINCT a.*, a.unit AS extend
FROM a
WHERE not exists 
(SELECT * from b where a.num=b.num and a.num1=b.num1)

转载于:https://www.cnblogs.com/begincsdn/archive/2005/11/22/281783.html

UNION,EXISTS,IN等在SQL语句中的灵活应用和场境的选择。相关推荐

  1. SQL语句中EXISTS的用法

    记录:258 在业务开展中,会遇到类似需求. 需求1:UPDATE表TEST_TB01中的记录:满足条件:这些记录不在TEST_TB02中. 需求2:UPDATE表TEST_TB01中的记录:满足条件 ...

  2. Sql 语句中 IN 和 EXISTS

    原文链接:  (2条消息)Sql 语句中 IN 和 EXISTS 的区别及应用 - jcpp9527的博客 - CSDN博客 https://blog.csdn.net/wqc19920906/art ...

  3. 【MySQL】sql语句中exists和in有何区别?

    1.概述 sql语句中exists和in有何区别? SQL语句优化有哪些方法? sq|语句中exists和in有何区别如下: exists是用循环( loop )的方式,由outer表的记录数决定循环 ...

  4. SQL点滴35—SQL语句中的exists

    原文:SQL点滴35-SQL语句中的exists 比如在Northwind数据库中有一个查询为 SELECT c.CustomerId,CompanyName FROM Customers c WHE ...

  5. sql语句中exists用法详解

    文章目录 一.语法说明 exists: not exists: 二.常用示例说明 1.查询a表在b表中存在数据 2.查询a表在b表中不存在数据 3.查询时间最新记录 4.exists替代distinc ...

  6. 理解SQL语句中 Exists()

    理解SQL语句中 Exists() exists对于主查询而言只有一个作用:返回ture或false,而其本身查询的結果集不具任何意义 因此在子查询的Select命令语句的字段行中通常使用通用字符*或 ...

  7. SQL语句中:UNION与UNION ALL的区别

    UNION用的比较多union all是直接连接,取到得是所有值,记录可能有重复 union 是取唯一值,记录没有重复 1.UNION 的语法如下:[SQL 语句 1]UNION[SQL 语句 2]2 ...

  8. sql语句中使用函数会耗费性能吗_挽救数据库性能的 30 条黄金法则 | 原力计划...

    作者 | geekguy 责编 | 王晓曼 出品 | CSDN博客 1. 优化查询,应尽量避免全表扫描,应该在用于检索数据和排序数据的字段上建立索引,如where子句用于搜索,order by子句用于 ...

  9. python解析sql语句表名_python正则表达式匹配sql语句中的表名

    [ string text = "select * from [admin] where aa=1 and cc='b' order by aa desc "; Regex reg ...

最新文章

  1. AI程序员,所有码农的梦想
  2. mysql ib_logfile 数量_Mysql 事务日志(Ib_logfile)
  3. 深度学习之四:常用模型和方法
  4. java发送get请求_如何快速掌握Java技术 Tomcat知识点有哪些
  5. Node的Web应用框架Express的简介与搭建HelloWorld
  6. python3手机脚本教学_python+adb命令实现自动刷视频脚本案例
  7. 话说Python:非主流编程语言
  8. 项目中CI缓存适配器的使用
  9. 悟透JavaScript
  10. 2017.5.5上午
  11. 比拼 Kafka, 大数据分析新秀Pulsar到底好在哪
  12. Oracle 使用GSON库解析复杂json串
  13. Vue 3开发的重要提示
  14. 用python读取txt文件、并计算数据的总合和平均值_Python,读取许多文件并合并结果...
  15. 公众号跳转小程序首次没有数据_小程序如何从“0”开始运营,变成获客神器...
  16. Bailian3164 奇偶排序【排序】
  17. SecureCRT for Mac(SSH终端仿真工具)
  18. VirtualBox虚拟机硬盘容量扩容
  19. 51单片机汇编语言指令汇总
  20. 【游戏角色设计初学入门】游戏角色制作过程及步骤

热门文章

  1. mysql8.0.21.0 安装
  2. android 菜鸟面单打印_1.0 Android基础入门教程
  3. linux系统chmod缩写,文件属性控制命令chmod
  4. mysql optimizer mrr_[转] MySQL 的 MRR 到底是什么?
  5. 学python适合什么年龄段的人用_7个现在就该学习Python 的理由【80%的人都不知道】...
  6. 关于脚本log返回乱码解决方法
  7. 计组之总线:2、总线仲裁(链式查询、计数器查询、独立请求、分布式查询)
  8. HookProc 和 CallNextHookEx
  9. 自然语言处理简介及开发环境
  10. openjudge 放苹果 1664