Ⅰ 如何看懂pl/sql中的tree
如何看懂pl/sql中的tree
oracle多用户操作有时候会造成session阻塞,形成了锁表等问题。可以使用sql语句进行查询,但用工具更为方便。本文就介绍使用PL/SQL developer工具查看或杀掉oracle的session。
Ⅱ 13.2. Query Tree(查询树)是什么
它是一个 SQL 语句的内部表现形式,这时组成该语句的每个部分都是分别存储的. 当你用调试级别(debuglevel)4 运行 PostgreSQL 后端并且在 SQL 界面交互地输入查询命令时可以看到这些查询树. 在 pg_rewrite 系统表里的规则动作也是以查询树的方式存储的. 不过不是用象调试输出那样的格式,但包含的内容是完全一样的. 读查询树的内容需要一定的经验, 我开始在规则系统上干活时曾经历了一段很困难的时光. 我还记得当初我站在一台咖啡机面前把杯子当做目标列, 水和咖啡粉当作可排列的元素,所有按钮是资格表达式来想象查询树的情景. 因为理解查询树的 SQL 表现就足以理解规则系统, 所以这份文档将不会告诉你如何读取它们. 这篇文档可能帮助你学习规则系统和它的命名习惯以便于后面的描述.13.2.1. Query Tree(查询树)的成员 当我们读取这份文档中查询树的SQL 表现时, 我们必须能够识别该语句被分解后放在查询树里的成员. 查询树的成员有 命令类型 ( command type ) 这是一个简单的值, 说明哪条命令 (SELECT,INSERT,UPDATE,DELETE)生成这个分析树. 范围表 (range table) 范围表是一个查询中使用的关系的列表. 在 SELECT 语句里是在 FORM 关键字后面给出的关系. 每个范围表表示一个表或一个视图,表明是查询里哪个成员调用了它. 在查询树里,范围表是用索引而不是用名字引用的, 所以这里不用象在 SQL语句里一样关心是否有重名问题. 这种情况在引入了规则的范围表后可能会发生. 本文档的例子将不讨论这种情况. 结果关系(result relation) 这是一个范围表的索引,用于标识查询结果前往的表. SELECT 查询通常没有结果关系表.特例 SELECT INTO 几乎等于一个 CREATE TABLE, INSERT ... SELECT 序列,所以这里我们就不单独讨论了. 在INSERT,UPDATE 和 DELETE 查询里, 结果关系(result relation )是更改发生影响的表(或视图!任何剩下的字段(既无给出值,也无缺省的) 将由规划器自动赋予一个常量 NULL 表达式. 在UPDATE 查询里,它(目标列)描述应该替换旧行的新行. 在规则系统里,它只包含来自查询的 SET attribute = expression 部分抽取的表达式. 这时,规划器将通过插入从旧行抽取数据到新 行的表达式的方法处理缺失的字段. 并且它也会象 在 DELETE 里那样增加特殊的CTID记录. 目标列里的每个元素都包含着一个表达式, 它可以为常量,可以为一个指向某个范围表里面的关系的一个字段的变量 ,可以为一个由函数调用,常量,变量,操作符等构成的表达式树. 条件(qualification) 查询条件是一个表达式,它非常类似那些包含在目标列里的条目. 这个表达式的值是一个布尔值,通过此值来判断对最终结果行是否要执操作 (INSERT,UPDATE,DELETE 或 SELECT).它是一个 SQL 语句 的 WHERE 子句. 连接树 查询的连接树显示了 FROM 子句的结构. 对于象 SELECT FROM a, b, c 这样的简单查询, 连接树只是一个 FROM 项的简单列表, 因为我们允许以任意顺序连接它们. 但如果使用了 JOIN 表达式 --- 尤其是 outer join 的时候, 我们就必须按照该连接显示的顺序进行连接. 连接树显示 JOIN 表达式的结构. 与特定的 JOIN 子句(来自 ON 或者 USING 表达式)相关的限制 做为附加在那些连接树节点的条件表达式存储. 事实证明把顶层 WHERE 表达式也当做附加在顶层连接树项的条件 来存储是非常方便的.所以实际上连接树代表 SELECT 语句的 FROM 和 WHERE 子句. 其他(others) 查询树的其他部分,像 ORDER BY 子句,我们不准备在这里讨论. 规则系统在附加规则时将在那里(ORDER BY 子句)替换条目, 但是这对于规则系统的基本原理并没有多大关系.
Ⅲ sql怎么实现树查询
CREATE TABLE T (CID VARCHAR(5),PID VARCHAR(5),CNAME VARCHAR(20))
GO
INSERT INTO T VALUES ('1','0','董事长')
INSERT INTO T VALUES ('2','1','CEO')
INSERT INTO T VALUES ('3','2','销售经理')
INSERT INTO T VALUES ('4','2','IT经理')
INSERT INTO T VALUES ('5','2','运营经理')
INSERT INTO T VALUES ('6','3','销售主管')
INSERT INTO T VALUES ('7','4','IT主管')
INSERT INTO T VALUES ('8','5','运营主管 ')
INSERT INTO T VALUES ('9','6','业务员')
INSERT INTO T VALUES ('10','7','程序员')
INSERT INTO T VALUES ('11','8','运营员')
GO
CREATE FUNCTION F(@CID INT)
RETURNS VARCHAR(50)
AS
BEGIN
DECLARE @R VARCHAR(50)
SELECT @R=PID+'.'+CID FROM T WHERE CID=@CID
WHILE EXISTS(SELECT 1 FROM T WHERE CID=(SELECT PID FROM T WHERE CID=@CID))
BEGIN
SELECT @CID=PID FROM T WHERE CID=@CID
SELECT @R=PID+'.'+@R FROM T WHERE CID=@CID
END
RETURN @R
END
GO
SELECT * FROM T WHERE DBO.F(CID) LIKE '%.2.%'
GO
DROP TABLE T
DROP FUNCTION F
提供个大概的思路,具体你还可以优化,把 LIKE里面的2换成其他CID既可查询对应的下属信息
Ⅳ SQL语句查询出一个父节点下的所有子节点
假如你的表名字是tt,创建下面的存储过程,使用存储过程即可查询。
create proc querytree
@user varchar(100)
as
begin
declare @id int
declare @T_tmp table(id int,username varchar(100),parentid int)
insert into @T_tmp select * from tt where username=@user
while(@@rowcount>0)
begin
insert into @T_tmp select * from tt where parentid in (select id from @T_tmp) and id not in(select id from @T_tmp)
end
select * from @T_tmp where username<>@user
end
Ⅳ SQL 2000 判断表TREE是否存在,如何存在则删除
IF EXISTS (SELECT 1
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE='BASE TABLE'
AND TABLE_NAME='TREE_ZSX')
Drop table TREE_ZSX;
Ⅵ sql 查询 tree
很高兴回答你的问题
根据你的需求,写的SQL如下:
select id,LPAD(name,LENGTH(name)+(LEVEL*10),' ')
from table_name
where 1=1 start with fid is null connect by PRIOR id=fid;
根据你的问题补充:
select id from table_name where id not in(
select id
from table_name
where 1=1 start with id=1 connect by PRIOR id=fid);上边这个sql就查询出来当id=1的时候,能作为它上级的id,
希望对你有所帮助!
Ⅶ sql怎么实现树查询
表格式如下:
cid pid cname
1 0 董事长
2 1 CEO
3 2 销售经理
4 2 IT经理
5 2 运营经理
6 3 销售主管
7 4 IT主管
8 5 运营主管
9 6 业务员
10 7 程序员
11 8 运营员
create function get_detail(
@id int
)returns @re table(id int,level int)
as
begin
declare @l int
set @l=0
insert @re select @id,@l
while @@rowcount>0
begin
set @l=@l+1
insert @re select a.cid,@l
from table_2 a,@re b
where a.pid=b.id and b.level=@l-1
end
return
end
go
--调用(查询所有的子)
select a.*,level=b.level from table_2 a,get_detail(2)b where a.cid=b.id
Ⅷ 有关sql查询tree的
根据你的需求,写的SQL如下:
select id,LPAD(name,LENGTH(name)+(LEVEL*10),' ')
from table_name
where 1=1 start with fid is null connect by PRIOR id=fid;
根据你的问题补充:
select id from table_name where id not in(
select id
from table_name
where 1=1 start with id=1 connect by PRIOR id=fid);上边这个sql就查询出来当id=1的时候,能作为它上级的id,
希望对你有所帮助!
Ⅸ sql树形查询分级
必须设置好表的parentID,ID第一级设置为0
witht1as(
selecttreelevel=1,parentID,ID,cast(1asvarchar(20))ROWNUMfrom表whereID=0
unionall
selecttreelevel=treelevel+1,t2.parentID,t2.ID,cast(t1.ROWNUM+'.'+cast(row_number()over(orderbyt2.itemid)asvarchar(10))asvarchar(20))ROWNUMfrom表t2joint1ont2.parentID=t1.id
)
select*fromt1orderbyROWNUM
Ⅹ mysql 如何查询一个带有树结构的表的数据
当然这种结构就不要追求什么效率了。如果要效率高的,只能改表结构。
1:select p2.id from table p1 ,table p2 where p1.id=p2.pid and p1.id=0
2:假设表名是tree
SQL codeselect distinct a.id from tree as a inner join tree as b on (a.pid = b.pid) where b.pid >=0;
select distinct a.id from tree as a inner join tree as b on (a.pid = b.pid) where b.pid >=2;
3.通过程序或数据库的store procere来实现了。 在mySQL中无法以一句SQL实现。