pgsql 删除一张表数据,条件是多表联合

本文展示了如何使用SQL进行复杂的多表操作,包括使用USING关键字删除指定条件的数据,以及结合INNERJOIN和LEFTJOIN进行表更新。示例涉及了基于几何数据的查询条件和特定版本的更新规则。

1. delete删除指定表数据,条件是多表关联查询  使用关键字:USING

DELETE 
FROM
	ics_check_misreport t1 USING ics_check_item t2 
WHERE
	t1.chk_id = t2.chk_id 
	AND t2.imp_level = 'S' 
	AND st_intersects ( 'MULTIPOLYGON Z (((119.146539847 29.266160672 104.327810735,119.147730849 29.267754088 110.982317651,119.147564803 29.269530686 116.539,119.148009726 29.271646475 121.7279,119.149970541 29.27535256 106.3257,119.152265233 29.277646223 116.9627,119.155660822 29.280874325 107.272217477,119.160814295 29.287016282 98.656636428,119.163883027 29.290240282 125.169836711,119.165437051 29.293187269 111.795152975,119.16663821 29.297902079 63.443199754,119.166463238 29.301505417 86.5921,119.164543012 29.308078876 110.7097,119.163203569 29.312422515 116.3266,119.162642948 29.315890256 91.3487,119.16293946 29.320160384 107.143009732,119.164208865 29.324562331 93.920710157,119.165330606 29.327082 78.808910917)))', st_astext ( t1.geom ) );
	

2. 更新一张表,条件是多表关联,使用再加上inner join 或 left join

UPDATE ics_check_misreport t1 
SET t1.chk_version = '20230705' 
FROM
	ics_check_item t2
	INNER JOIN ics_check_report t3 ON t3.chk_id = t2.chk_id 
WHERE
	t1.chk_id = t2.chk_id 
	AND t2.imp_level = 'S' 
	AND t1.chk_version = 'V1.3'

2.两个表联合更新

UPDATE ics_check_misreport t1 
SET t1.chk_version = '20230705' 
FROM
	ics_check_item t2
WHERE
	t1.chk_id = t2.chk_id 
	AND t2.imp_level = 'S' 
	AND t1.chk_version = 'V1.3'

在 PostgreSQL 中合并同一张的不同查询条件结果集,通常可以通过使用 `UNION` 或 `UNION ALL` 操作符来实现。这两个操作符用于将个 `SELECT` 查询的结果组合成一个结果集。 ### 使用 `UNION ALL` 如果你不需要去除重复的行,并且希望尽可能快地获取结果,可以使用 `UNION ALL`。它会保留所有行,包括重复的行[^2]。例如: ```sql SELECT * FROM tb_student WHERE class_id IN (1, 2) UNION ALL SELECT * FROM tb_student WHERE birthdate IS NOT NULL; ``` ### 使用 `UNION` 如果你需要确保结果集中没有重复的行,则应该使用 `UNION`。这会导致数据库对结果进行去重处理,因此执行速度可能会比使用 `UNION ALL` 要慢[^2]。例如: ```sql SELECT * FROM tb_student WHERE class_id IN (1, 2) UNION SELECT * FROM tb_student WHERE birthdate IS NOT NULL; ``` ### 注意事项 - 当使用 `UNION` 或 `UNION ALL` 时,每个 `SELECT` 语句中的列数必须相同,并且相应的列的数据类型也必须兼容。 - 如果查询涉及大量数据,应考虑性能影响。对于大数据量的情况,建议优先使用 `UNION ALL` 并在应用层做去重逻辑,除非确实需要在数据库端去重。 - 在某些情况下,可能还可以通过使用 `CASE` 达式或者子查询来达到类似的效果,但这取决于具体的业务需求和数据结构。 ### 示例:使用 CASE 达式 如果需要在同一查询中根据不同条件返回不同的计算结果,可以使用 `CASE` 达式: ```sql SELECT id, name, CASE WHEN class_id IN (1, 2) THEN 'Class 1 or 2' WHEN birthdate IS NOT NULL THEN 'Has Birthdate' ELSE 'Other' END AS category FROM tb_student; ``` 这种方法可以在单次扫描中完成条件判断,避免了次查询带来的开销。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值