You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL:如何从video_all中排除video_real的同键数据行?

PostgreSQL实现筛选video_all中video_real不存在的记录

问题场景

现有两张表的数据如下:

video_real表

device_id | video_definition 
-----------+------------------
         1 |              360
         1 |              480
(2 rows)

video_all表

device_id | video_definition 
-----------+------------------
         1 |              360
         1 |              480
         1 |              540
         1 |              720
         1 |             1080
(5 rows)

需要提取出video_all中存在,但video_real里没有的记录,目标结果:

device_id | video_definition 
----------+------------------
        1 |              540
        1 |              720
        1 |             1080
(3 rows)

实现方式

下面给你几种可行的PostgreSQL写法:

1. 使用NOT EXISTS子查询

这是最直观的写法,通过子查询判断当前记录是否在video_real中不存在:

SELECT device_id, video_definition
FROM video_all va
WHERE NOT EXISTS (
    SELECT 1
    FROM video_real vr
    WHERE vr.device_id = va.device_id
      AND vr.video_definition = va.video_definition
);

2. 使用LEFT JOIN + IS NULL

通过左连接两张表,筛选出连接后video_real字段为空的记录,也就是video_all独有的数据:

SELECT va.device_id, va.video_definition
FROM video_all va
LEFT JOIN video_real vr
    ON va.device_id = vr.device_id
    AND va.video_definition = vr.video_definition
WHERE vr.device_id IS NULL;

3. 使用EXCEPT集合操作

EXCEPT会返回第一个查询结果中存在,但第二个查询结果中没有的记录,注意两个查询的字段顺序和类型要完全一致:

SELECT device_id, video_definition
FROM video_all
EXCEPT
SELECT device_id, video_definition
FROM video_real;

这三种方法都能得到你想要的结果,实际使用时可以根据表的数据量和索引情况选择,比如NOT EXISTS在两张表的关联字段有索引时,性能通常更优。

内容的提问来源于stack exchange,提问作者Ariel Zhao

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 04:48:19