PostgreSQL 实现子查询返回多行的案例
作为一个表达式使用的子查询返回了多列:
在查询中,我们需要以第2条查询语句作为第一条查询语句的条件,但是第一条根据这个条件查询出来是多个数据,这时候又需要保留多个数据,运用子查询就会报错,
以下就为解决这种多对多关系查询,且没有关联关系的表的解决方案:
selectc.rain_value,c.ad_nmfrom ( select*,json::json->t2.lon_latasrain_valuefromactual_time_model_jsont1, (SELECTDISTINCTlon||'_'||lataslon_lat,ad_nmfromgrid_all_points_null)t2wheresection='0'andt1.filename='Z_NWGD_C_BCCD_20180711022009_P_RFFC_SPCC-ER01_201807110800_02401.GRB2' )cwherec.rain_valueisnotnull
补充: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_idIN( SELECT inventory.film_id FROM rental INNERJOINinventoryONinventory.inventory_id=rental.inventory_id WHERE return_dateBETWEEN'2005-05-29' AND'2005-05-30' );
EXISTS操作符
在where子句的查询条件中,exists操作符,会在子查询有返回行时,返回true;不论返回几行。
因此,子查询中的查询字段仅写1就好;标准的写法:EXISTS(SELECT1FROMtblWHEREcondition)
SELECT first_name, last_name FROM customer WHERE EXISTS( SELECT 1 FROM payment WHERE payment.customer_id=customer.customer_id );
NOEXISTS,与之相反,当子查询返回0行时,返回true
SELECTfirst_name, last_name FROMcustomerc WHERENOTEXISTS (SELECT1 FROMpaymentp WHEREp.customer_id=c.customer_id ANDamount>11) ORDERBYfirst_name, last_name;
当子查询返回NULL,会返回true,也就是返回所有行。
SELECT first_name, last_name FROM customer WHERE EXISTS(SELECTNULL) ORDERBY first_name, last_name;
ANY
与任何子查询返回的值匹配就返回true
expresionoperatorANY(subquery)
表达式一般为字段
操作符为>,<,=,<>,>=,<=
ANY可以与SOME替换
子查询返回的必须是一列,
SELECTtitle FROMfilm WHERElength>=ANY( SELECTMAX(length) FROMfilm INNERJOINfilm_categoryUSING(film_id) GROUPBYcategory_id);
The=ANYisequivalenttoINoperator.
Notethatthe<>ANYoperatorisdifferentfromNOTIN.Thefollowingexpression:
x<>ANY(a,b,c)
isequivalentto
x<>aORx<>bORx<>c
ALL
所有子查询返回的值匹配则返回true
也就是大于最大,小于最小
SELECT film_id, title, length FROM film WHERE length>ALL( SELECT ROUND(AVG(length),2) FROM film GROUPBY rating ) ORDERBY length;
以上为个人经验,希望能给大家一个参考,也希望大家多多支持毛票票。如有错误或未考虑完全的地方,望不吝赐教。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。