① sql一个表能否和自身进行连接说明理由
可以啊,这叫自连接。但是from子句后面都是同一个表,所以必须给这个表取两个不同的别名然后进行连接。
② 在写SQL语句时什么时候需要用到自表关联,谁能举个完整的例子
比如公司的部门结构,
人事部门,他的下级 考勤科,数据存储在一个表中
org_code = 考勤科, up_org_code = 人事部门
,表名是人事 表,我需要查询人事的上下级部门关系,则需要
select B.org_code, A.org_code
from 人事表 A, 人事表 B
where A.up_org_code = b.org_code
;
结果就是 人事部门 -> 考勤科
明白了吗?
③ sql server自关联
对表自身取笛卡尔积,然后去掉客户名称相同的
SELECTa.[证件号码],a.[客户名称],b.[证件号码]AS[证件号码2],b.[客户名称]AS[客户名称2]
FROM[测试数据]ASa,[测试数据]ASb
WHEREa.[证件号码]=b.[证件号码]ANDa.[客户名称]!=b.[客户名称]
④ 如何设置SQL数据库表与表的关联关系
如果是 父子关系, 或者 一对多 关系。
可以通过 创建外键的方式, 在 父表 与 子表之间, 创建一个关联关系。
例如:
-- 创建测试主表. ID 是主键.
CREATE TABLE test_main (
id INT NOT NULL,
value VARCHAR(10),
PRIMARY KEY(id)
);
-- 创建测试子表.
CREATE TABLE test_sub (
id INT NOT NULL,
main_id INT ,
value VARCHAR(10),
PRIMARY KEY(id)
);
-- 插入测试主表数据.
INSERT INTO test_main(id, value) VALUES (1, 'ONE');
INSERT INTO test_main(id, value) VALUES (2, 'TWO');
-- 插入测试子表数据.
INSERT INTO test_sub(id, main_id, value) VALUES (1, 1, 'ONEONE');
INSERT INTO test_sub(id, main_id, value) VALUES (2, 2, 'TWOTWO');
SQL> -- 创建外键(默认选项)
SQL> ALTER TABLE test_sub ADD CONSTRAINT main_id_cons FOREIGN KEY (main_id) REFERENCES test_main;
Table altered.
SQL>
SQL> -- 测试删除主表数据. 将出错 ORA-02292: 违反完整约束条件
SQL> DELETE
2 test_main
3 WHERE
4 ID = 1;
DELETE
*
ERROR at line 1:
ORA-02292: integrity constraint (HR.MAIN_ID_CONS) violated - child record found
⑤ SQL数据库中表与表之间的关联怎么建立
1、在数据库窗口中,单击“创建”中“表格”中的“表设计”,打开表设计窗口。
⑥ SQL 自关联如何去重复
你没有清楚你到底要问的是什么,去重复只有两种情景需要用到:
非合并结果去重复记录
合并结果记录去重复
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
⑦ 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
⑧ sql合表禁止在同一张中间表中自关联什么意思
就是两个表只能单独查询。
只用在查询的时候用两个表的查询就可以了,一般表的id都是自动生成的,你在查询的时候可以用一个中间表或者视图来实现,将所需要的信息写到里面去,一般是不建议把第一个表的id直接写到另外一个里面去,那样就有两个查询的条件了,也就是你的id和name,那样是没用的,不利于表之间的优化的,最好是在第一次存取的时候就将表的字段生成,只进行行内的修改和整体的查询输出。
用updatex2setuid=(selectidfromx1wherex1.name=z2.name),来实现就好了,其实吧,我建议你把一个表里面的name干掉就留一个表的,然后用id做他们之间的主键来实现他们之间的关联,这个在数据库方面是通用的,现在数据库都需要优化,尤其是在多表查询的时候,所以你还是用心的研究一下,最好不要重复多个字段在表之间的重复查询,结果容易重复,所以我还是建议你把表优化,而不是考虑把值加进去,做到用什么就从表之间查什么就好了。
⑨ 有个人事表自关联,sql语句怎么写
select id,name,老板id,老板名字
from 人事表 inner join 老板表
on 人事表.老板id = 老板表.老板id
⑩ sql单表自身连接查询问题
select 姓名name,电话tel,email,家庭住址city
from s as s1
join s as s2 on
s1.专业号MaID=s2.专业号MaID
where s1.姓名name='张三'
select 学号,姓名,生日
from s as s1
join s as s2 on
s1.师号TutorID
=s2.专业号MaID
where s1.姓名name='张三'