`

一个实现类似find contains many(many in many)的sql 语句

 
阅读更多

有如下一种需求(使用班级class和学生student表来描述)

1
找到学生中即有名字叫张三也有名字叫李四的班级,其中参数<名字>表示任意多个名字,即不限仅有两个参数。

在这种需求中,如果仅只有张三和李四两个条件,则sql可以写成如下:

1
2
3
select a.* from class a where
exists(select 1 from student where classId=a.id and name=张三)
and exists(select 1 from student where classid=a.id and name=李四)

在以上的条件中,有两个条件,因此有两个exists子句。而如果有更多呢,比如三个或四个以上,那么 这个exists就会更多。在使用以java实现的sql语句中,就需要使用程序(如for循环)来组装sql了。

有一种更好的解决办法如下,即类似一种 (张三,李四)均在指定班级的学生列表中这种理解方式。使用伪码来描述就是

1
2
3
select a.* rom class a inner join a.studentList where a.studentList.names contains(张三,李思)
select a.* rom class a inner join a.studentList where (张三,李思)in a.studentList.names

就是这种集合之间包含的例子,即保证一个集合在另一个集合中。然而现在的sql还没有能够直接表示这种的,更多的使用是使用in来表示一个参数值在一个集合中,而不是一个子集合包含一系列指定的参数。

那么反过来呢,我们利用in来处理这种问题,当学生有一个名字满足参数中值的时候就+1,那么符合条件的班级中的对学生计数的值一定就等于参数列表的长度了(这里必须假设参数值是不相同的)。简单的逻辑如下所示:

1
2
3
4
对每一个班级进行分组
对每一个班级中的学生进行处理
当学生中的名字满足条件,计数值+1
即最终计数值=条件长度的班级信息,此即我们要查找的班级

使用sql来实现,那么整个实现的sql如下所示:

1
2
3
4
5
select * from class where id in (
    select a.id from class a inner join student b on b.classId = a.id
    group by a.id
    having count(case b.name in (张三,李四) then 1 end)=2
)

以上sql在oracle 10g下测试通过,这里利用了count只对有值的数据计数,而对null不计数的特点。

分享到:
评论

相关推荐

    常用 SQL 语句大全+50个常用sql语句总结

    根据给定的文件信息,以下是对“常用 SQL 语句大全+50个常用sql语句总结”的详细解析,涵盖数据操作、数据定义、数据控制、事务控制以及程序化 SQL 等方面的重要知识点。 ### 数据操作 1. **SELECT**:用于从...

    SQLserver常用语句大全

    * CREATE TABLE 语句:创建一个数据库表 * DROP TABLE 语句:从数据库中删除表 * ALTER TABLE 语句:修改数据库表结构 * CREATE VIEW 语句:创建一个视图 * DROP VIEW 语句:从数据库中删除视图 * CREATE INDEX 语句...

    SQL语句大全大全

    - **功能**:创建一个数据库表。 - **语法**: ```sql CREATE TABLE table_name ( column1 datatype constraints, column2 datatype constraints, ... ); ``` #### DROP TABLE - **功能**:从数据库中删除表...

    PostgreSQL find_in_set 内核开发

    博客:PostgreSQL的学习心得和知识总结(六十五)|关于PostgreSQL数据库 实现MySQL数据库find_in_set()函数 的实现方案

    SQL语句英文翻译成中文

    1. **CREATE TABLE** - 创建一个新的数据库表,定义其结构,包括列名、数据类型等。 2. **DROP TABLE** - 删除已存在的表,永久性地移除所有相关数据。 3. **ALTER TABLE** - 修改已有表的结构,如添加、删除或更改...

    牛人总结的SQL语句

    根据给定的信息,“牛人总结的SQL语句”是一篇关于SQL语言中经典语句的总结,涵盖了多种数据库操作命令,下面将详细解释这些知识点。 ### SQL基础操作 #### 数据查询(SELECT) - **功能**: 查询数据库中的数据。 ...

    mysql中find_in_set函数的基本使用方法

    FIND_IN_SET(str,strlist) 定义 假如字符串str在由多个子链组成的字符串列表strlist中,则返回值的范围在1到N之间。 一个字符串列表就是一个由一些被‘,’符号分开的自链组成的字符串。 如果第一个参数是一个...

    SQL语句大全.txt

    - `IN` 用于匹配一组值中的任意一个。 - `LIKE` 用于模式匹配。 - `%` 代表任意数量的字符。 - `_` 代表单个字符。 - `[]` 表示字符集,如 `[a-zA-Z]` 包含所有大写和小写字母。 - `[^]` 表示排除字符集,如 `...

    SQL语句大全(SQLServer)

    - `CLOSE cursor_name` 关闭一个游标。 #### PREPARE/EXECUTE - 这些命令用于预编译SQL语句: - `PREPARE statement_name FROM 'SQL_statement';` - `EXECUTE statement_name USING @var1, @var2, ...` #### ...

    常用 SQL 语句大全

    #### CREATE TABLE:创建一个数据库表 - `CREATE TABLE table_name (column1 datatype, column2 datatype,...)`:定义新的表结构。 - 示例:`CREATE TABLE customers (id INT PRIMARY KEY, name VARCHAR(100), ...

    Linux实现类似find命令的myfind

    仿照unix操作系统中的find命令,在实现一个myfind命令。myfind命令从指定的目录下开始,递归地查找指定文件

    SQL语句大全word文档

    根据给定的文件信息,以下是对SQL语句大全中关键知识点的详细解析: ### SQL语句大全:数据操作 #### SELECT - **功能**:从数据库表中检索数据行和列。 - **语法示例**:`SELECT * FROM table_name WHERE column_...

    mongodb sql语句速成

    mongodb与mysql SQL语句区别: ex: select * from users db.users.find();

    SQL语句大全

    - **功能**:创建一个存储过程,存储过程是一组预编译的SQL语句。 - **示例**:`CREATE PROCEDURE procedure_name AS SQL statement;` #### DROP PROCEDURE - **功能**:从数据库中删除存储过程。 - **示例**:`...

    利用标准的SQL语句实现查询记录分页

    在Oracle等数据库中,可能需要使用`ROWNUM`或`RANK()`等函数来实现类似的效果。 总的来说,实现分页查询有多种方法,包括EJB的Find方法、一次性加载所有数据、多次查询数据库、缓存机制等。选择哪种方法取决于具体...

    常用SQL 语句大全

    **功能**: `SELECT` 语句是最基本也是最重要的SQL命令之一,用于从一个或多个表中检索数据。 **示例**: ```sql SELECT * FROM table_name WHERE column_name OPERATOR value; ``` - `SELECT *`: 表示选择所有列。 -...

    Mysql中FIND_IN_SET()和IN区别简析

    `FIND_IN_SET()` 函数主要用于在一个由逗号分隔的字符串中查找特定元素的位置。它的语法是: ```sql FIND_IN_SET(str, strlist) ``` 其中,`str` 是要查找的字符串,`strlist` 是一个由逗号分隔的字符串列表。如果...

Global site tag (gtag.js) - Google Analytics