PostgreSQL 实现子查询返回多行的案例

作为一个表达式使用的子查询返回了多列:

在查询中,我们需要以第2条查询语句作为第一条查询语句的条件,但是第一条根据这个条件查询出来是多个数据,这时候又需要保留多个数据,运用子查询就会报错,

以下就为解决这种多对多关系查询,且没有关联关系的表的解决方案:

select c.rain_value,c.ad_nm from
(
select *, json::json->t2.lon_lat as rain_value from actual_time_model_json t1,
(SELECT DISTINCT lon || '_' || lat as lon_lat,ad_nm from grid_all_points_null)t2 where section='0' and t1.filename = 'Z_NWGD_C_BCCD_20180711022009_P_RFFC_SPCC-ER01_201807110800_02401.GRB2'
)c where c.rain_value is not null

补充:PostgreSQL 的子查询 相关的知识 ,exists,any,all

Subquery

SELECT
 film_id,
 title,
 rental_rate
FROM
 film
WHERE
 rental_rate > (
  SELECT
   AVG (rental_rate)
  FROM
   film
 );

有了子查询,在设定 需要查询表才能得到 查询条件时,就可以 直接 在一条语句中 写,不用分开多条写了,方便了许多。

子查询返回多条时,可以在 where 子句中 用 IN,来匹配查询条件。

SELECT
 film_id,
 title
FROM
 film
WHERE
 film_id IN (
  SELECT
   inventory.film_id
  FROM
   rental
  INNER JOIN inventory ON inventory.inventory_id = rental.inventory_id
  WHERE
   return_date BETWEEN '2005-05-29'
  AND '2005-05-30'
 );

EXISTS 操作符

在 where 子句的 查询条件中,exists 操作符,会在子查询有返回行时,返回true;不论返回几行。

因此,子查询中的查询字段仅写1就好;标准的写法:EXISTS (SELECT 1 FROM tbl WHERE condition)

SELECT
 first_name,
 last_name
FROM
 customer
WHERE
 EXISTS (
  SELECT
   1
  FROM
   payment
  WHERE
   payment.customer_id = customer.customer_id
 );

NO EXISTS ,与之相反,当子查询返回0行时,返回true

SELECT first_name,
  last_name
FROM customer c
WHERE NOT EXISTS
 (SELECT 1
  FROM payment p
  WHERE p.customer_id = c.customer_id
  AND amount > 11 )
ORDER BY first_name,
   last_name;

当子查询返回 NULL,会返回true, 也就是返回所有行。

SELECT
 first_name,
 last_name
FROM
 customer
WHERE
 EXISTS( SELECT NULL )
ORDER BY
 first_name,
 last_name;

ANY

与任何子查询返回的 值 匹配就 返回 true

expresion operator ANY(subquery)

表达式一般为 字段

操作符为 >,<,=,<>,>=,<=

ANY 可以与 SOME 替换

子查询 返回的 必须是 一列,

SELECT title
FROM film
WHERE length >= ANY(
 SELECT MAX( length )
 FROM film
 INNER JOIN film_category USING(film_id)
 GROUP BY category_id );

The = ANY is equivalent to IN operator.

Note that the <> ANY operator is different from NOT IN. The following expression:

x <> ANY (a,b,c) 

is equivalent to

x <> a OR x <> b OR x <> c

ALL

所有子查询返回的值 匹配 则 返回 true

也就是 大于最大,小于最小

SELECT
 film_id,
 title,
 length
FROM
 film
WHERE
 length > ALL (
   SELECT
    ROUND(AVG (length),2)
   FROM
    film
   GROUP BY
    rating
 )
ORDER BY
 length;

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。如有错误或未考虑完全的地方,望不吝赐教。

(0)

相关推荐

  • 解决postgresql insert into select无法使用并行查询的问题

    本文信息基于PG13.1. 从PG9.6开始支持并行查询.PG11开始支持CREATE TABLE - AS.SELECT INTO以及CREATE MATERIALIZED VIEW的并行查询. 先说结论: 换用create table as 或者select into或者导入导出. 首先跟踪如下查询语句的执行计划: select count(*) from test t1,test1 t2 where t1.id = t2.id ; postgres=# explain analyze se

  • postgresql insert into select无法使用并行查询的解决

    本文信息基于PG13.1. 从PG9.6开始支持并行查询.PG11开始支持CREATE TABLE - AS.SELECT INTO以及CREATE MATERIALIZED VIEW的并行查询. 先说结论: 换用create table as 或者select into或者导入导出. 首先跟踪如下查询语句的执行计划: select count(*) from test t1,test1 t2 where t1.id = t2.id ; postgres=# explain analyze se

  • 基于postgresql查询某个字段属于哪个表的说明

    一.场景还原 前端小林问我,它从前端的返回的某些字段,想知道那个表有这个字段,它想操作这个表-- 二.sql语句 SELECT * FROM information_schema. COLUMNS WHERE COLUMN_NAME = 'storename'; SELECT c.relname AS "表名",a.attname AS "字段名",c.oid FROM pg_class c LEFT JOIN pg_attribute a ON a.attreli

  • postgresql 补齐空值、自定义查询字段并赋值操作

    查询出的数据自定义url字段并赋值 select id,name,'/index/' url from table_name 补充:postgresql 判断是空的_postgresql 数字类型存空值或null值.字段查询处理 1.存储数字类型,包含Integer,Double等,拼接字符串时,数字类型的值拼接成以下 一个stqyghmj 为数据库字段名,第二个stqyghmj 是值变量 stqyghmj = cast(nullif(" + stqyghmj + ", null)AS

  • postgresql 实现查询出的数据为空,则设为0的操作

    我就废话不多说了~ select name,price from odoo_sale; select name,COALESCE(price, 0) from odoo_sale; 补充:postgresql查询某列的最大值时,对查询结果为空做默认为0的处理 实例如下: select coalesce(max(max_grade),0) from exam_grade where examinee_id = 12345 and exam_id = 1; 查询某个考生在某个指定试卷的最高分,如果没

  • PostgreSQL 实现给查询列表增加序号操作

    利用 ROW_NUMBER() over( ) 给查询序列增加排序字段 SELECT ROW_NUMBER() over(ORDER bY biztypename DESC ) AS num,biztypename FROM (SELECT DISTINCT biztypename FROM bizmaptype) t; 效果如下: 补充:PostgreSql 使用自定义序列(Sequence)向表插入数据 id 自增长 按照以往Oracle建表的流程,我们来新建表,并且向表中导入数据. 1.创

  • PostgreSQL 实现子查询返回多行的案例

    作为一个表达式使用的子查询返回了多列: 在查询中,我们需要以第2条查询语句作为第一条查询语句的条件,但是第一条根据这个条件查询出来是多个数据,这时候又需要保留多个数据,运用子查询就会报错, 以下就为解决这种多对多关系查询,且没有关联关系的表的解决方案: select c.rain_value,c.ad_nm from ( select *, json::json->t2.lon_lat as rain_value from actual_time_model_json t1, (SELECT D

  • MySQL中列子查询与行子查询操作的学习教程

    MySQL 列子查询及 IN.ANY.SOME 和 ALL 操作符的使用 MySQL 列子查询 列子查询是指子查询返回的结果集是 N 行一列,该结果通常来自对表的某个字段查询返回. 一个列子查询的例子如下: SELECT * FROM article WHERE uid IN(SELECT uid FROM user WHERE status=1) 列子查询中使用 IN.ANY.SOME 和 ALL 操作符 由于列子查询返回的结果集是 N 行一列,因此不能直接使用 = > < >= &l

  • Oracle基础学习之子查询

    首先使用子查询的时候注意事项包括,子查询可以嵌套多层和子查询需要圆括号()括起来,下面我们来看看详细的介绍. 基础介绍 1,wherer:子查询一般会返回单行单列 单行多列 多行单列 : 2,having:子查询会返回单行单列,同时表示要使用统计函数: 3,from:子查询返回多行多列数据(表结构): 4,select:返回单行单列 (一般不使用): 示例详解 where(进行数据行的筛选操作): a:查询出低于公司平均工资的雇员信息. select * from emp where sal<(

  • Oracle在PL/SQL中使用子查询

    目录 一.概述 1.单行子查询(子查询只返回一行) 2.多行单列子查询(子查询返回多行) 3.多列子查询 二.在DDL语句中使用子查询 1.create table 2.create View 3.create materialized view 建立实体化视图 三.在DML语句中使用子查询 1.INSERT 2.UPDATE 3.DELETE 四.WITH语句 五.相关子查询. 一.概述 在一个SQL语句中嵌套另一个SQL语句成为子查询.包括单行子查询,多行子查询,多列子查询. 注意,当在DD

  • 解决Mysql多行子查询的使用及空值问题

    目录 1 定义 2 多行比较操作符 3 空值问题 3.1 问题 3.2 解决 1 定义 也称为集合比较子查询 内查询返回多行 使用多行比较操作符 2 多行比较操作符 -- 多行子查询 -- IN SELECT employee_id, manager_id, department_id FROM employees WHERE manager_id IN ( -- 在返回集合中查找有没有相同的manager_id在里面 SELECT manager_id FROM employees WHERE

  • 详细讲述MySQL中的子查询操作

    继续做以下的前期准备工作: 新建一个测试数据库TestDB: create database TestDB; 创建测试表table1和table2: CREATE TABLE table1 ( customer_id VARCHAR(10) NOT NULL, city VARCHAR(10) NOT NULL, PRIMARY KEY(customer_id) )ENGINE=INNODB DEFAULT CHARSET=UTF8; CREATE TABLE table2 ( order_id

  • MySQL中表子查询与关联子查询的基础学习教程

    MySQL 表子查询 表子查询是指子查询返回的结果集是 N 行 N 列的一个表数据. MySQL 表子查询实例 下面是用于例子的两张原始数据表: article 表: blog 表: SQL 如下: SELECT * FROM article WHERE (title,content,uid) IN (SELECT title,content,uid FROM blog) 查询返回结果如下所示: 该 SQL 的意义在于查找 article 表中指定的字段同时也存在于 blog 表中的所有的行(注

  • 在MySQL中使用子查询和标量子查询的基本操作教程

    MySQL 子查询 子查询是将一个 SELECT 语句的查询结果作为中间结果,供另一个 SQL 语句调用.MySQL 支持 SQL 标准要求的所有子查询格式和操作,也扩展了特有的几种特性. 子查询没有固定的语法,一个子查询的例子如下: SELECT * FROM article WHERE uid IN(SELECT uid FROM user WHERE status=1) 对应的两个数据表如下: article 文章表: user 用户表: 查询返回结果如下所示: 在该例子中,首先通过子查询

  • oracle基本查询操作子查询用法实例分析

    本文实例讲述了oracle基本查询操作子查询用法.分享给大家供大家参考,具体如下: 一.子查询语法 SELECT select_list FROM table WHERE expr operator (SELECT select_list FROM table); 子查询在主查询之前一次执行完成. 子查询的结果被主查询使用. select ename from emp where sal > (select sal from emp where ename='SCOTT'); (*注意:子查询要

  • 实例详解mysql子查询

    子查询分类 按返回结果集分类 子查询按返回结果集的不同分为4种:表子查询,行子查询,列子查询和标量子查询. 表子查询:返回的结果集是一个行的集合,N行N列(N>=1).表子查询经常用于父查询的FROM子句中. 行子查询:返回的结果集是一个列的集合,一行N列(N>=1).行子查询可以用于福查询的FROM子句和WHERE子句中. 列子查询:返回的结果集是一个行的集合,N行一列(N>=1). 标量子查询:返回的结果集是一个标量集合,一行一列,也就是一个标量值.可以指定一个标量表达式的任何地方,

随机推荐