Oracle数据库单表自关联查询疑问

Oracle数据库单表自关联查询疑问,第1张

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数据库单表自关联查询疑问、数据库的单引号问题、数据库,单表查询,多表查询,子查询等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9319665.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存