首页 > 解决方案 > SQL - 左连接同一张表,使用ON语句匹配左右表时出现问题

问题描述

我是 SQL 新手。考虑下表(表1)

s_id    v_id
1       1
2       1
2       2
2       3
2       5
2       6
2       7
3       1
3       2
3       6
3       7
3       8
4       1
and so on

这里请暂时考虑 s_id 2 和 3。我想要 s_id=2 的记录,这在 s_id=3(v_id 3 和 5)中不可用。不要在意 s_id=3 (v_id 8) 中的新 id

我需要的输出

s_id    v_id
2       3
2       5

我尝试了以下查询,但它返回的结果与我需要的相反。

SELECT a.* 
  from table1 a 
  LEFT 
  JOIN table1 b 
    ON a.v_id = b.v_id 
 WHERE a.s_id = 2 
   AND b.s_id = 3

在这里,我知道 ON 语句中的条件是错误的。应该是这样的

a.v_id is not in b.v_id 

在这里我不想有一个子查询。欢迎加入或简单查询。

标签: sqlpostgresql

解决方案


https://www.db-fiddle.com/f/6H4ubXubMgJuoadXuxHbv4/0

SELECT t1.*
FROM t1
WHERE s_id = 2
  AND v_id NOT IN (
      SELECT v_id 
      FROM t1
      WHERE s_id = 3
      )

或者,您可以将JOIN查询转换为:

https://www.db-fiddle.com/f/vCVDCV9sCu7F8QoFiU5in9/1

SELECT a.* from table1 a 
LEFT JOIN table1 b 
ON a.v_id = b.v_id
   AND b.s_id=3
WHERE a.s_id=2 
   AND b.v_id IS NULL

推荐阅读