您是否曾经想过如何在SQL中表达如下“感觉”的谓词:

WHERE Var1 OR Var2 IN (1, 2, 3)

/ u / CyBerg90在reddit上具有 。 这个想法是创建一个谓词,只要Var1Var2值都Var2 1、2或3,就产生真。

规范的解决方案

规范的解决方案显然是将其全部写为:

WHERE Var1 = 1 OR Var1 = 2 OR Var1 = 3
OR    Var2 = 1 OR Var2 = 2 OR Var2 = 3

但是,有很多重复。

使用IN谓词

大多数读者只会将两个IN谓词联系起来:

WHERE Var1 IN (1, 2, 3)
OR    Var2 IN (1, 2, 3)

或聪明的人可能会这样颠倒谓词,以形成等价物:

WHERE 1 IN (Var1, Var2)
OR    2 IN (Var1, Var2)
OR    3 IN (Var1, Var2)

使用EXISTS和JOIN的更好的解决方案

所有先前的解决方案在某种程度上都需要语法/表达式重复。 尽管这可能不会对性能产生重大影响,但在表达长度方面,它肯定会爆炸。 更好的解决方案(从该角度来看)利用EXISTS谓词,构造当Var1Var2得出1、2或3时非空的临时集合。

下面是EXISTSJOIN

WHERE EXISTS (SELECT 1FROM (VALUES (Var1), (Var2)) t1(v)JOIN (VALUES (1), (2), (3)) t2(v)ON t1.v = t2.v
)

此解决方案构造了两个表,每个表都有一个单一值,并将它们联接到该值上:

+------+    +------+
| t1.v |    | t2.v |
+------+    +------+
| Var1 |    |    1 |
| Var2 |    |    2 |
+------+    |    3 |+------+

查看维恩图 ,很容易看出JOIN将如何只产生两个集合中同时存在的来自t1t2那些值:

使用EXISTS和INTERSECT的最佳解决方案

但是,人们在阅读JOIN时可能不会想到一个设定的交集。 那么,为什么不通过INTERSECT使用实际的交集呢? 我认为以下是最好的解决方案:

WHERE EXISTS (SELECT vFROM (VALUES (Var1), (Var2)) t1(v)INTERSECTSELECT vFROM (VALUES (1), (2), (3)) t2(v)
)

观察一下,SQL语句的长度如何随O(m + n) (或简单地为O(N) ,其中m, n = number of values in each set ,而使用IN的原始解决方案随O(m * n) (或简称为O(N 2 ) )。

流行的RDBMS中的INTERSECT支持

在SQL标准以及jOOQ支持的以下任何RDBMS中, INTERSECT均得到广泛支持:

  • BR
  • DB2
  • 德比
  • H2
  • 汉娜
  • 数据库
  • Informix
  • 英格利斯
  • 甲骨文
  • PostgreSQL的
  • SQLite的
  • SQL服务器
  • Sybase ASE
  • Sybase SQL Anywhere

实际上,以下数据库也支持较少使用的INTERSECT ALL ,它不会从结果包中删除重复的值(另请参见UNIONUNION ALL )。

  • BR
  • PostgreSQL的

相交愉快!

翻译自: https://www.javacodegeeks.com/2015/08/intersect-the-underestimated-two-way-in-predicate.html

INTERSECT –谓词中被低估的双向相关推荐

  1. sql中intersect_INTERSECT –谓词中被低估的双向

    sql中intersect 您是否曾经想过如何在SQL中表达如下"感觉"的谓词: WHERE Var1 OR Var2 IN (1, 2, 3) / u / CyBerg90在re ...

  2. rest web服务_在WildFly的REST Web服务中与Jackson的双向关系

    rest web服务 这是使用Jackson的REST Web服务中Java实体之间的双向关系的示例. 假设我们在两个实体Parent和Child之间存在双向关系. 使用MySQL工作台为这两个表生成 ...

  3. 在WildFly的REST Web服务中与Jackson的双向关系

    这是使用Jackson的REST Web服务中Java实体之间的双向关系的示例. 假设我们在两个实体Parent和Child之间存在双向关系. 使用MySQL工作台为这两个表生成SQL模式文件. DR ...

  4. jpa级联添加_JPA中的一对多双向关联与级联操作

    学习Spring有两周时间了 , 个人觉得服务端主要实现的是数据关系的维护和数据结构的制定 , 以及由业务需求产生的CRUD , 只要保证对前端提供的接口稳定高效响应 , 具体的前端实现完全不关心. ...

  5. angular中自定义组件实现双向绑定

    使用get,set关键字 get返回父组件变化后的值 set为组件值产生变化后父组件改变 import {Input, Output } from '@angular/core'; ........ ...

  6. tensorflow中对lstm及双向lstm的理解

    双向RNN(LSTM)的实现参考: https://github.com/aymericdamien/TensorFlow-Examples/blob/master/examples/3_Neural ...

  7. php intersect,PHP中的array_intersect()函数

    array_intersect()函数比较数组值,并返回匹配项.它返回一个包含第一个数组中所有值的数组,该数组的值存在于所有参数中. 语法array_intersect(arr1, arr2, arr ...

  8. js 取得input绑定的datalist中的值_javascript基础修炼(9)——MVVM中双向数据绑定的基本原理...

    [小宅按] 开发者的javascript造诣取决于对[动态]和[异步]这两个词的理解水平. 一. 概述 1.1 MVVM模型 MVVM模型是前端单页面应用中非常重要的模型之一,也是Single Pag ...

  9. android——databinding中字符串的拼接处理、TextView显示的值随activity的属性值改变同时改变--LiveData、双向绑定过滤器、监听某个值的改变

    简介 使用的技术是观察者与被观察者的模式,在google推荐的案例中也有使用到,现在我把它封装成一个扩展函数,使得使用更加简单明了 注意 1.在build.gradle添加databinding,在a ...

最新文章

  1. python写接口自动化需要rsa加密_RSA加密,请问如何用Python实现该加密过程
  2. css修改同步保存到文件,谷歌浏览器修改CSS和js后同步保存到文件中 (译)
  3. ubuntu下 windows的zip文件打开,中文目录和文件名乱码
  4. ssd目标检测训练自己的数据_目标检测Tensorflow object detection API之训练自己的数据集...
  5. NFS服务启动:rpc.nfsd: writing fd to kernel failed: errno 111 (Connection refused)
  6. 容器技术Docker K8s 45 Serverless Kubernetes(ASK)详解-ECI Pod管理
  7. ICON艾肯live声卡系列驱动安装设置方法
  8. jrtplib-2.11.2和jthread-1.3.3编译笔记
  9. 【游戏技术】建造防守 Build and Defense
  10. Android开发,GPS获取实时时间并转为北京时间,定位信息,海拔高度,并进行显示
  11. 爆火书单视频怎么制作?实用制作教程来了
  12. excel筛选后复制粘贴
  13. 2023最新素材解析网站源码搭建和原理,附带PHP小例子。
  14. GPT-3+DALL-E 2 = 海量带标签数据自动生成 ?
  15. int和Integer区别,为什么有了int还要有Integer
  16. CSDN发表文章数量限制的缺陷
  17. 「营业日志 2020.12.10」Jiangly 的排列数数题
  18. matlab绘画三维图形(三)
  19. redis stream 实现消息队列
  20. mysql 商品规格表_shop数据库表设计,整理一下商品规格相关表的字段说明

热门文章

  1. 带你入门多目标跟踪(四)外观模型 Appearance Model
  2. pygame演示----黑猩猩小游戏
  3. 蘑菇街2021财年Q1财报:直播GMV连续18个季度保持增长
  4. 如何修复老照片?这三个方法建议收藏
  5. 学习廖雪峰Git入门教程--总结
  6. 工厂数字化转型必备的多协议转换网关
  7. linux操作系统c语言编程,Linux操作系统下C语言编程从零开始
  8. linux ps -ef命令输出详解,Linux-ps命令学习
  9. 助创cms众筹 php,助创cms汽车众筹系统:仿车车车汽车众筹源码程序
  10. ndk开发(二)JNI、java互调