如何在SQL Server中使用Join子句返回两表查询结果?附示例
分析SQL Server中RIGHT JOIN查询的逻辑及完整结果
咱们来一步步拆解这个SQL查询的逻辑,看看它到底返回了什么结果,以及背后的原因。
1. 表结构与测试数据
首先先明确两张表的结构和插入的测试数据:
Figure表(存储月度统计数据)
CREATE TABLE Figure( MonthNumber varchar(10), Code varchar(10), Figure int ); INSERT INTO Figure (MonthNumber, Code, Figure) VALUES ('5', 'S', '25'), ('5','G', '30'), ('4','K', '30');
Person表(存储人员编码)
CREATE TABLE Person( Code varchar(10) ); INSERT INTO Person (Code) VALUES ('S'), ('G'), ('K'), ('D'), ('J');
2. 执行的查询语句
SELECT F.[MonthNumber], F.[Code], F.[Figure] FROM Figure F RIGHT JOIN Person P ON F.[Code] = P.[Code] WHERE F.[MonthNumber] = '5'
3. 查询逻辑分析
这里的核心是RIGHT JOIN和WHERE条件的组合作用,咱们拆开来看:
- RIGHT JOIN Person:原本的作用是保留
Person表中的所有行,同时匹配Figure表中Code相同的行;如果Person中的Code在Figure里没有对应数据,Figure的列会显示为NULL。 - WHERE F.[MonthNumber] = '5':这个条件会过滤掉所有
MonthNumber不等于'5'的行,包括那些MonthNumber为NULL的行(因为NULL和任何值比较都不成立)。
结合两者的效果:
- Person中的
S:在Figure里有MonthNumber='5'的记录,符合条件,会被保留。 - Person中的
G:同样在Figure里有MonthNumber='5'的记录,符合条件,会被保留。 - Person中的
K:在Figure里对应的MonthNumber是'4',不符合WHERE条件,被过滤。 - Person中的
D和J:在Figure里没有任何匹配记录,所以F.MonthNumber是NULL,不满足='5'的条件,也被过滤。
4. 完整查询结果
最终返回的结果如下:
| MonthNumber | Code | Figure |
|---|---|---|
| 5 | S | 25 |
| 5 | G | 30 |
内容的提问来源于stack exchange,提问作者Ryan Gadsdon
相关产品推荐
相关产品推荐

