当前位置:首页 » 编程语言 » sql表自关联
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

sql表自关联

发布时间: 2022-08-26 19:40:20

A. 已经建立了两个表,请问如何用sql语句建立关联

以下对ORACLE,SQL
SERVER等都适用:
自然连接(列名相同,只选相同列名下两边值相等的行):
SELECT
*
FROM
STUDENT
A
NATURAL
JOIN
SCORE
B
内连接(列名不一定相同,只选满足ON条件的行):
SELECT
*
FROM
STUDENT
A
INNER
JOIN
SCORE
B
ON
A.SNO
=
B.SNO
左外连接(列名不一定相同,只选满足ON条件的行和左表的全部,右表填充空值):
SELECT
*
FROM
STUDENT
A
LEFT
OUTER
JOIN
SCORE
B
ON
A.SNO
=
B.SNO
右外连接(列名不一定相同,只选满足ON条件的行和右表的全部,左表填充空值):
SELECT
*
FROM
STUDENT
A
RIGHT
OUTER
JOIN
SCORE
B
ON
A.SNO
=
B.SNO
全外连接(列名不一定相同,只选满足ON条件的行和两边表的全部,无匹配的全部填充空值)
SELECT
*
FROM
STUDENT
A
FULL
OUTER
JOIN
SCORE
B
ON
A.SNO
=
B.SNO
全连接(笛卡尔积,所有行和所有行交叉组合形成新表)
SELECT
*
FROM
STUDENT
A
CROSS
JOIN
SCORE
B

B. 有个人事表自关联,sql语句怎么写

select id,name,老板id,老板名字
from 人事表 inner join 老板表
on 人事表.老板id = 老板表.老板id

C. 在写SQL语句时什么时候需要用到自表关联,谁能举个完整的例子

比如公司的部门结构,
人事部门,他的下级 考勤科,数据存储在一个表中
org_code = 考勤科, up_org_code = 人事部门
,表名是人事 表,我需要查询人事的上下级部门关系,则需要

select B.org_code, A.org_code
from 人事表 A, 人事表 B
where A.up_org_code = b.org_code
;

结果就是 人事部门 -> 考勤科
明白了吗?

D. sql server自关联

对表自身取笛卡尔积,然后去掉客户名称相同的

SELECTa.[证件号码],a.[客户名称],b.[证件号码]AS[证件号码2],b.[客户名称]AS[客户名称2]
FROM[测试数据]ASa,[测试数据]ASb
WHEREa.[证件号码]=b.[证件号码]ANDa.[客户名称]!=b.[客户名称]

E. SQL连接 表自己的连接

sql 连接可分为以下几类:

1、 一个表与自身进行连接,称为自连接
例子:

有一个学生表,里面有 学号 功课编号
学生成绩三个字段.用一个SQL查询语句得出每门功课成绩最好的前两名

学号 功课编号 学生成绩
1 1 99
2 1 98
3 1 100
4 2 88
5 2 87
6 2 88
7 3 99
8 3 88
9 3 100

解决方法
SELECT DISTINCT 学生表1.*
FROM 学生表 学生表1 INNER JOIN
学生表 学生表2 ON 学生表1.学号 IN
(SELECT TOP 2 学生表.学号
FROM 学生表
WHERE 学生表.功课编号 = 学生表1.功课编号
ORDER BY 学生成绩 DESC)

查询结果
学号 功课编号 学生成绩
1 1 99
2 1 98
4 2 88
6 2 88
7 3 99
9 3 100

2、内联接(典型的联接运算,使用像 = 或 <> 之类的比较运算符)。包括相等联接和自然联接。
内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行。例如,检索 students和courses表中学生标识号相同的所有行。

3、外联接。外联接可以是左向外联接、右向外联接或完整外部联接。
在 FROM子句中指定外联接时,可以由下列几组关键字中的一组指定:
1)LEFT JOIN或LEFT OUTER JOIN
左向外联接的结果集包括 LEFT OUTER子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值。
2)RIGHT JOIN 或 RIGHT OUTER JOIN
右向外联接是左向外联接的反向联接。将返回右表的所有行。如果右表的某行在左表中没有匹配行,则将为左表返回空值。
3)FULL JOIN 或 FULL OUTER JOIN
完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。

4、交叉联接
交叉联接返回左表中的所有行,左表中的每一行与右表中的所有行组合。交叉联接也称作笛卡尔积。

FROM 子句中的表或视图可通过内联接或完整外部联接按任意顺序指定;但是,用左或右向外联接指定表或视图时,表或视图的顺序很重要。有关使用左或右向外联接排列表的更多信息,请参见使用外联接。

例子:
-------------------------------------------------
a表 id name b表 id job parent_id
1 张3 1 23 1
2 李四 2 34 2
3 王武 3 34 4
a.id同parent_id 存在关系
--------------------------------------------------
1) 内连接
select a.*,b.* from a inner join b on a.id=b.parent_id
结果是
1 张3 1 23 1
2 李四 2 34 2

2)左连接
select a.*,b.* from a left join b on a.id=b.parent_id
结果是
1 张3 1 23 1
2 李四 2 34 2
3 王武 null

3) 右连接
select a.*,b.* from a right join b on a.id=b.parent_id
结果是
1 张3 1 23 1
2 李四 2 34 2
null 3 34 4

4) 完全连接
select a.*,b.* from a full join b on a.id=b.parent_id
结果是
1 张3 1 23 1
2 李四 2 34 2
null 3 34 4
3 王武 null

F. SQL 自关联如何去重复

  1. 你没有清楚你到底要问的是什么,去重复只有两种情景需要用到:

  • 非合并结果去重复记录

  • 合并结果记录去重复

2、非合并结果去重复:对单表查询或者关联表查询的返回结果数据集,去除重复的记录(所有的结果列值全部一致才算重复),这种使用DISTINCT关键字实现

SELECTDISTINCT字段1,字段2……
FROM数据表

3、合并结果记录去重复:A UNION B,将B的结果集合并到A中(两个结果集列数量和对应的列类型必须保持一致),并且如果B中的记录在A中已经存在,那么将抛弃不进行合并。注意:如果A本身就存在重复的记录,还是会都出现,如果不想让出现,需要用DISTINCT去重复

SELECT字段1,字段2……
FROM表A
UNION
SELECT字段1,字段2……
FROM表B

G. mysql怎么让2个表关联起来

方法和操作步骤如下:

1、首先,创建一个测试表,如下图所示,然后进入下一步。

H. sql合表禁止在同一张中间表中自关联什么意思

就是两个表只能单独查询。
只用在查询的时候用两个表的查询就可以了,一般表的id都是自动生成的,你在查询的时候可以用一个中间表或者视图来实现,将所需要的信息写到里面去,一般是不建议把第一个表的id直接写到另外一个里面去,那样就有两个查询的条件了,也就是你的id和name,那样是没用的,不利于表之间的优化的,最好是在第一次存取的时候就将表的字段生成,只进行行内的修改和整体的查询输出。
用updatex2setuid=(selectidfromx1wherex1.name=z2.name),来实现就好了,其实吧,我建议你把一个表里面的name干掉就留一个表的,然后用id做他们之间的主键来实现他们之间的关联,这个在数据库方面是通用的,现在数据库都需要优化,尤其是在多表查询的时候,所以你还是用心的研究一下,最好不要重复多个字段在表之间的重复查询,结果容易重复,所以我还是建议你把表优化,而不是考虑把值加进去,做到用什么就从表之间查什么就好了。