INTERSECT –谓词中被低估的双向
您是否曾经想过如何在SQL中表达如下“感觉”的谓词:
WHERE Var1 OR Var2 IN (1, 2, 3)
/ u / CyBerg90在reddit上具有 。 这个想法是创建一个谓词,只要Var1
和Var2
值都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
谓词,构造当Var1
和Var2
得出1、2或3时非空的临时集合。
下面是EXISTS
与JOIN
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将如何只产生两个集合中同时存在的来自t1
和t2
那些值:
使用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
,它不会从结果包中删除重复的值(另请参见UNION
与UNION ALL
)。
- BR
- PostgreSQL的
相交愉快!
翻译自: https://www.javacodegeeks.com/2015/08/intersect-the-underestimated-two-way-in-predicate.html
INTERSECT –谓词中被低估的双向相关推荐
- sql中intersect_INTERSECT –谓词中被低估的双向
sql中intersect 您是否曾经想过如何在SQL中表达如下"感觉"的谓词: WHERE Var1 OR Var2 IN (1, 2, 3) / u / CyBerg90在re ...
- rest web服务_在WildFly的REST Web服务中与Jackson的双向关系
rest web服务 这是使用Jackson的REST Web服务中Java实体之间的双向关系的示例. 假设我们在两个实体Parent和Child之间存在双向关系. 使用MySQL工作台为这两个表生成 ...
- 在WildFly的REST Web服务中与Jackson的双向关系
这是使用Jackson的REST Web服务中Java实体之间的双向关系的示例. 假设我们在两个实体Parent和Child之间存在双向关系. 使用MySQL工作台为这两个表生成SQL模式文件. DR ...
- jpa级联添加_JPA中的一对多双向关联与级联操作
学习Spring有两周时间了 , 个人觉得服务端主要实现的是数据关系的维护和数据结构的制定 , 以及由业务需求产生的CRUD , 只要保证对前端提供的接口稳定高效响应 , 具体的前端实现完全不关心. ...
- angular中自定义组件实现双向绑定
使用get,set关键字 get返回父组件变化后的值 set为组件值产生变化后父组件改变 import {Input, Output } from '@angular/core'; ........ ...
- tensorflow中对lstm及双向lstm的理解
双向RNN(LSTM)的实现参考: https://github.com/aymericdamien/TensorFlow-Examples/blob/master/examples/3_Neural ...
- php intersect,PHP中的array_intersect()函数
array_intersect()函数比较数组值,并返回匹配项.它返回一个包含第一个数组中所有值的数组,该数组的值存在于所有参数中. 语法array_intersect(arr1, arr2, arr ...
- js 取得input绑定的datalist中的值_javascript基础修炼(9)——MVVM中双向数据绑定的基本原理...
[小宅按] 开发者的javascript造诣取决于对[动态]和[异步]这两个词的理解水平. 一. 概述 1.1 MVVM模型 MVVM模型是前端单页面应用中非常重要的模型之一,也是Single Pag ...
- android——databinding中字符串的拼接处理、TextView显示的值随activity的属性值改变同时改变--LiveData、双向绑定过滤器、监听某个值的改变
简介 使用的技术是观察者与被观察者的模式,在google推荐的案例中也有使用到,现在我把它封装成一个扩展函数,使得使用更加简单明了 注意 1.在build.gradle添加databinding,在a ...
最新文章
- python写接口自动化需要rsa加密_RSA加密,请问如何用Python实现该加密过程
- css修改同步保存到文件,谷歌浏览器修改CSS和js后同步保存到文件中 (译)
- ubuntu下 windows的zip文件打开,中文目录和文件名乱码
- ssd目标检测训练自己的数据_目标检测Tensorflow object detection API之训练自己的数据集...
- NFS服务启动:rpc.nfsd: writing fd to kernel failed: errno 111 (Connection refused)
- 容器技术Docker K8s 45 Serverless Kubernetes(ASK)详解-ECI Pod管理
- ICON艾肯live声卡系列驱动安装设置方法
- jrtplib-2.11.2和jthread-1.3.3编译笔记
- 【游戏技术】建造防守 Build and Defense
- Android开发,GPS获取实时时间并转为北京时间,定位信息,海拔高度,并进行显示
- 爆火书单视频怎么制作?实用制作教程来了
- excel筛选后复制粘贴
- 2023最新素材解析网站源码搭建和原理,附带PHP小例子。
- GPT-3+DALL-E 2 = 海量带标签数据自动生成 ?
- int和Integer区别,为什么有了int还要有Integer
- CSDN发表文章数量限制的缺陷
- 「营业日志 2020.12.10」Jiangly 的排列数数题
- matlab绘画三维图形(三)
- redis stream 实现消息队列
- mysql 商品规格表_shop数据库表设计,整理一下商品规格相关表的字段说明