首页 > 数据库 >7.12 SQL Server自连接

7.12 SQL Server自连接

时间:2023-01-29 11:22:40浏览次数:46  
标签:customer city name 7.12 Server SQL c2 c1 id

SQL Server Self Join

目录

简介

自连接将表连接到自身。它有助于查询层级数据或比较同一表中的行。

自联接使用内联接(INNER JOIN)或左联接(LEFT JOIN)子句。因为使用自联接的查询引用的是同一个表,,所以为了区别表它们,得使用别名为查询中的同一表分配不同的名称。

注意:在查询中引用多个相同的表而不使用表别名将报错。

语法:

SELECT
    select_list
FROM
    T t1
[INNER | LEFT]  JOIN T t2 ON
    join_predicate; 

查询两次引用表T。表别名t1和t2用于在查询中为T表分配不同的名称。

自连接查询示例

1)使用自连接查询层级数据

有如下员工表(sales.staffs):

员工表存储了员工得基本信息:员工Id,名字,姓氏,邮箱,还有一列manager_id制定了直接管理者Id。比如说因为Mireyamanager_id中的值是Fabiola,所以FabiolaMireya得上级领导。Mireya得像Fabiola报告工作。

Fabiola没有更上层领导(应该是最高层),因此manager_id列为NULL

如果要知道谁是谁的直属领导,可以使用如下自连接查询:

SELECT
    e.first_name + ' ' + e.last_name employee,
    m.first_name + ' ' + m.last_name manager
FROM
    sales.staffs e
INNER JOIN sales.staffs m ON m.staff_id = e.manager_id
ORDER BY
    manager;

在本例中,我们引用了两次staffs表:一次作为员工的e,另一次作为领导的m。连接条件使用e.manager_idm.staff_id匹配员工和领导关系。

因为是使用的内连接的自连接(INNER JOIN),由于Fabiola Jackson没有上层领导,所以他就没有匹配上,没有出现在结果集中,如果想要Fabiola Jackson也展示出来,则可以使用左连接(LEFT JOIN):

SELECT
    e.first_name + ' ' + e.last_name employee,
    m.first_name + ' ' + m.last_name manager
FROM
    sales.staffs e
LEFT JOIN sales.staffs m ON m.staff_id = e.manager_id
ORDER BY
    manager;

2)使用自联接比较表中的行

有如下客户表:

以下语句使用自联接查找位于同一城市的客户。

SELECT
    c1.city,
    c1.first_name + ' ' + c1.last_name customer_1,
    c2.first_name + ' ' + c2.last_name customer_2
FROM
    sales.customers c1
INNER JOIN sales.customers c2 ON c1.customer_id > c2.customer_id
AND c1.city = c2.city
ORDER BY
    city,
    customer_1,
    customer_2;

以下条件确保该语句不会与同一客户进行比较:

c1.customer_id > c2.customer_id

以下条件匹配两个客户的城市:

AND c1.city = c2.city

注意,如果把大于号(>)改成不等于(<>)符号,结果中将会包含更多行:

SELECT
    c1.city,
    c1.first_name + ' ' + c1.last_name customer_1,
    c2.first_name + ' ' + c2.last_name customer_2
FROM
    sales.customers c1
INNER JOIN sales.customers c2 ON c1.customer_id <> c2.customer_id
AND c1.city = c2.city
ORDER BY
    city,
    customer_1,
    customer_2;
```![](/i/l/?n=23&i=blog/1552138/202301/1552138-20230129111101384-1487636211.png)

我们看看`ON`子句中的`>`和`<>`之间的区别,将其限制为一个城市,以便于比较。
```sql
SELECT 
   customer_id, first_name + ' ' + last_name c, 
   city
FROM 
   sales.customers
WHERE
   city = 'Albany'
ORDER BY 
   c;

此查询在ON子句中使用(>)运算符:

SELECT
    c1.city,
    c1.first_name + ' ' + c1.last_name customer_1,
    c2.first_name + ' ' + c2.last_name customer_2
FROM
    sales.customers c1
INNER JOIN sales.customers c2 ON c1.customer_id > c2.customer_id
AND c1.city = c2.city
WHERE c1.city = 'Albany'
ORDER BY
    c1.city,
    customer_1,
    customer_2;

此查询在ON子句中使用(<>)运算符:

SELECT
    c1.city,
	c1.first_name + ' ' + c1.last_name customer_1,
    c2.first_name + ' ' + c2.last_name customer_2
FROM
    sales.customers c1
INNER JOIN sales.customers c2 ON c1.customer_id <> c2.customer_id
AND c1.city = c2.city
WHERE c1.city = 'Albany'
ORDER BY
	c1.city,
    customer_1,
    customer_2;

标签:customer,city,name,7.12,Server,SQL,c2,c1,id
From: https://www.cnblogs.com/michaelshen/p/17072112.html

相关文章

  • 人人都在聊的云原生数据库Serverless到底是什么?
    摘要:华为云数据库营销专家TonyChen和华为云数据库高级产品经理佳恩开展了一场关于云原生数据库与Serverless结合的直播对话。云计算的迅猛发展推动了数据库的变革,云原生......
  • 7.8 SQL Server内连接查询
    SQLServerInnerJoin目录SQLServerInnerJoinSQLServer内连接介绍SQLServer内连接(INNERJOIN)语法更多的SQLServer内连接示例SQLServer内连接介绍内连接是SQL......
  • 7.7 SQL Server连接查询
    SQLServer连接查询目录SQLServer连接查询简介创建示例表SQLServer内连接SQLServer左联接SQLServer右连接SQLServer全联接简介在关系数据库中,数据分布在多个逻辑......
  • SQLSERVER 事务日志的 LSN 到底是什么?
    SQLSERVER事务日志的LSN到底是什么? 一:背景1.讲故事大家都知道数据库应用程序 它天生需要围绕着数据文件打转,诸如包含数据的 .mdf,事务日志的 .ldf,很多时候深......
  • docker安装Mysql5.7
    Linuxdocker安装Mysql1.docker镜像地址配置vim/etc/docker/daemon.json2.加入配置信息{"registry-mirrors":["https://wghlmi3i.mirror.aliyuncs.com","https://d......
  • MySQL基础:通过SQL对数据库进行CRUD
    MySQL基础今日目标:能通过SQL对数据库进行CRUD文章目录MySQL基础一、MySQL数据模型二、SQL概述2.1SQL简介2.2通用语法2.3SQL分类三、DDL:操作数据库3.1查询3.2创建数据......
  • PaddlePaddle与Serverless架构结合
    PaddlePaddle介绍PaddlePaddle(飞桨)以百度多年的深度学习技术研究和业务应用为基础,是中国首个自主研发、功能完备、开源的产业级深度学习平台,集深度学习核心训练和推理框架、......
  • 文本情感分析在Serverless架构下的应用
    文本情感分析是指对包含人们观点、喜好、情感等的主观性文本进行检测。该领域的发展和快速起步得益于社交媒体。越来越多的用户从单纯地获取互联网信息向创造互联网信息转变......
  • PyTorch与Serverless架构结合
    PyTorch介绍2017年1月,FAIR(FacebookAIResearch)发布了PyTorch。其标志如下所示。PyTorch是在Torch基础上用Python语言重新打造的一款深度学习框架,Torch是用Lua语言打造的机......
  • scikit-learn与Serverless架构结合
    1scikit-learn介绍scikit-learn是一个面向Python的第三方提供的非常强力的机器学习库,简称sklearn,标志如下所示。它建立在NumPy、SciPy和Matplotlib上,包含从数据预处理到训......