sql - 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
在这里我不想有一个子查询。欢迎加入或简单查询。
解决方案
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
推荐阅读
- flutter - Flutter 启用并聚焦 textformfield
- bash - Bash 测试变量和程序在同一条语句中退出
- xamarin.forms - 从主详细信息中的选项卡式页面导航到登录页面时,应用程序在 iOS13+ 中崩溃
- c++ - 为什么 Valgrind 在不释放 malloc 的内存后不报告任何问题?
- php - MPDF Wordpress 引入变量
- c - 为什么 Windows 和 Linux 有不同的 strdup 实现:strdup() 和 _strdup()?
- python - VBS 使用为当前用户定义的 python COM 类
- python - 按特定键合并字典列表并将不同的值附加到列表中
- graph - Spotfire DenseRank + 过滤器
- intellij-idea - 如何将 intelliJ 与 Jira 票连接起来?