select user_code,user_name,related_code from tablename t left join tablename s on tuser_code=srelated_code;
根据你提供的测试数据,输出结果还是这样,不变。
------------------------------------------------------
通过你补充了问题说明,我分析了下,程序如下:
SQL> select from re_a;
USER_CODE USER_NAME RELATED_CODE
---------- -------------------------------- ------------
1001 张三 1002
1002 李四 1001
1003 王五 1004
1004 赵六 1003
SQL> select from re_bak;
USER_CODE USER_NAME RELATED_CODE
---------- -------------------------------- ------------
SQL> exec pro_relation_baidu;
1001张三1002
1003王五1004
PL/SQL procedure successfully completed
SQL>create or replace procedure pro_relation_baidu IS
/CREATE TABLE re_a(user_code NUMBER,user_name VARCHAR(32),related_code NUMBER);
INSERT INTO RE_A VALUES ('1001', '张三', '1002');
INSERT INTO RE_A VALUES ('1002', '李四', '1001');
INSERT INTO RE_A VALUES ('1003', '王五', '1004');
INSERT INTO RE_A VALUES ('1004', '赵六', '1003');
SELECT FROM re_a;
create table re_bak as select from re_a where 1=2;/
CURSOR cur_rea IS SELECT FROM re_a;
CURSOR cur_bak IS SELECT FROM re_bak;
--v_rea re_a%ROWTYPE;
j NUMBER;
BEGIN
DELETE re_bak;
FOR i IN cur_rea LOOP
SELECT COUNT(tUSER_CODE) INTO j FROM re_bak t WHERE
tUSER_CODE=iRELATED_CODE AND tRELATED_CODE=iUSER_CODE;
IF j=0 THEN
INSERT INTO re_bak VALUES(iUSER_CODE,iUSER_NAME,iRELATED_CODE);
ELSE
NULL;
END IF;
END LOOP;
FOR i IN cur_bak LOOP
dbms_outputput_line(iUSER_CODE||iUSER_NAME||iRELATED_CODE);
END LOOP;
end pro_relation_baidu;
set @str=''
这里是 为 @str 这个变量,设置一个初始的值, 为 长度为0的字符串。
目的是,万一下面的
select @str=@str+ cast(学号 as varchar(100))+ ','
from table2 where 班级=@int
没有记录
那么 再下面的
Set @str = SubString(@str,1,len(@str)-1)
不会发生异常。
否则的话,一个变量,没有初始化, 对这个变量,执行
SubString(@str,1,len(@str)-1)
的 *** 作, 将导致异常发生。
注意点
select 指定表字段 from 表1,表2
四则运算包括加减乘除
select 字段1 四则运行符号 字段2 from 表名称
语法:select 函数(字段1) from 表名称
统计函数
binary
区分大小写
语法:select 段落 from 表明 where binary 字段
分组
语法
selectfrom 表名
where
group by 字段名称 #如果这里有多个字段,A,B,用,连接表示具有相同字段A以及相同字段B进行分组
having 判断内容
注意 :
排序
语法:默认为升序
ord by 字段名称
固定升序或者降序
多个条件排序主次关系
ord by 主字段,次字段
限制显示记录
对于单页表 *** 作
limit start count
对于多页 *** 作
分页原理:先查询总数据条数 设为a
确定每页数量b
总页数为c = a / b 如果除不尽则需要加1 例如 10 / 3 正确页数为4
查询语句的起始位置为s = 当前页数d 减去1 乘以每页数量
即 s = (d - 1) b
limit s b
语法 :where 字段名称 regexp '正则表达式'
注意:正则表达式不包括特殊字符如\w
语法:select from 表1,表2
他会把多个表每行与另外个表统统匹配上,其中会有一些脏数据,我们可以用里面值的关系进行连接
其本质就是笛卡尔积查询
区别是把,变成 join
且不能用where,要先用on根据里面值的关系拼接好了再用 where
左表中记录的无论是否有匹配关系都全部显示,右表中仅显示匹配成功的记录
语法:select from 表1 left join,表2
右表中记录的无论是否有匹配关系都全部显示,左表中仅显示匹配成功的记录
语法:select from 表1 right join 表2
无论是否匹配成功,两边表中的记录都要全部显示
select from 表1 full join 表2
注意:mysql 不支持
我们要引入union
union 只能用于字段数量相同的两个表 会自动去除重复的记录
union all 则保留所有记录
select from dept left join emp on deptid=empdept_id
union
select from dept right join emp on deptid=empdept_id;
可以完成全外连接
在三表以及三表以上查询的时候,表1 join 表2 join 表三,其意思是表1与表2连接后的表再与表3进行连接
如果三表连接时候没有用join而是用 , 进行连接表示同时查询3个表
将查找后的内容作为查找的值或者查找的对象,
如果要作为一个表当作查找对象,要对于查找后的表进行重命名语法如下
select from (select from ) as 新名字
xists 后跟子查询 子查询有结果是为True 没有结果时为False
为true时外层执行 为false外层不执行
双链表的插入问题:
q = new DLinkNode(x);
qperv = pprev ;
qnext = p ;
pprevnext=q;
pprev =q;
qperv = pprev ;
先把q的前一个结点=p的前一个结点
qnext = p ;
先把q的下一个结点=p
这是在q前面插入了p点前
pprevnext=q;
把以前P当个下一个结点的点 的下一个结点改成Q
pprev =q;
把P的前一个结点改成Q
相当于从p前面砍一刀再把两端的绳子绑在q结点上
完成
以上就是关于Oracle数据库单表自关联查询疑问全部的内容,包括:Oracle数据库单表自关联查询疑问、数据库的单引号问题、数据库,单表查询,多表查询,子查询等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)