oracle中的SQL的connect by是做啥用的

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle中的SQL的connect by是做啥用的相关的知识,希望对你有一定的参考价值。

参考技术A 树结构,同时要跟START WITH一起用本回答被提问者采纳 参考技术B --用法一
[TEST@orcl] SQL>select rownum from dual connect by rownum < 4;
ROWNUM
----------
1
2
3
--用法二
[SCOTT@orcl] SQL>SELECT EMPNO,ENAME,MGR
2   FROM EMP
3   CONNECT BY PRIOR EMPNO=MGR
4   START WITH ENAME='BLAKE';

EMPNO ENAME MGR
---------- ---------- ----------
7698 BLAKE 7839
7499 ALLEN 7698
7521 WARD 7698
7654 MARTIN 7698
7844 TURNER 7698
7900 JAMES 7698
参考技术C 一般是用来查询 数型结构的。
例如:
CREATE TABLE test_tree (
test_id INT,
pid INT,
test_val VARCHAR(10),
PRIMARY KEY (test_id)
);

INSERT INTO test_tree VALUES(1, NULL, '.NET');
INSERT INTO test_tree VALUES(2, 1, 'C#');
INSERT INTO test_tree VALUES(3, 1, 'J#');
INSERT INTO test_tree VALUES(4, 1, 'ASP.NET');
INSERT INTO test_tree VALUES(5, 1, 'VB.NET');

INSERT INTO test_tree VALUES(6, NULL, 'J2EE');
INSERT INTO test_tree VALUES(7, 6, 'EJB');
INSERT INTO test_tree VALUES(8, 6, 'Servlet');
INSERT INTO test_tree VALUES(9, 6, 'JSP');

INSERT INTO test_tree VALUES(10, NULL, 'Database');
INSERT INTO test_tree VALUES(11, 10, 'DB2');
INSERT INTO test_tree VALUES(12, 10, 'mysql');
INSERT INTO test_tree VALUES(13, 10, 'Oracle');
INSERT INTO test_tree VALUES(14, 10, 'SQL Server');

INSERT INTO test_tree VALUES(15, 13, 'PL/SQL');
INSERT INTO test_tree VALUES(16, 15, 'Function');
INSERT INTO test_tree VALUES(17, 15, 'Procedure');
INSERT INTO test_tree VALUES(18, 15, 'Package');
INSERT INTO test_tree VALUES(19, 15, 'Cursor');

INSERT INTO test_tree VALUES(20, 14, 'T-SQL');

SQL> ed
Wrote file afiedt.buf

1 SELECT
2 LPAD(' ', 2*(LEVEL-1)) || test_val AS test_val
3 FROM
4 test_tree
5 START WITH
6 test_id IN (1, 6, 10)
7* CONNECT BY PRIOR test_id = pid
SQL> /

TEST_VAL
-----------------------------------------------------------

.NET
C#
J#
ASP.NET
VB.NET
J2EE
EJB
Servlet
JSP
Database
DB2

TEST_VAL
-----------------------------------------------------------

MySQL
Oracle
PL/SQL
Function
Procedure
Package
Cursor
SQL Server
T-SQL

20 rows selected.

gcc __thread 是做啥的?

【中文标题】gcc __thread 是做啥的?【英文标题】:What does gcc __thread do?gcc __thread 是做什么的? 【发布时间】:2015-02-15 06:04:39 【问题描述】:

我真的很困惑 gcc __thread 的关键字在背后做了什么。

谁能给我一些信息?

【问题讨论】:

我找到了这篇文章,docs.oracle.com/cd/E19683-01/817-3677/chapter8-1/index.html 【参考方案1】:

它将变量声明为 thread local 与 C++11 中的 thread_local 关键字非常相似,重要的区别在于 thread_local 允许静态初始化,而 __thread 不允许。 如this answer 中所述,进行静态初始化的能力可能会对性能产生显着影响(每次访问的函数调用)。

线程本地意味着访问此变量的每个线程都将看到一个单独的不同变量,就好像它们确实是具有不同名称的变量(尽管它们在源级别上是相同的名称)。

编译器实现这一点的具体做法是实现定义和平台相关的。典型的实现(不同版本的 GCC 不同)包括调用例如Linux 下的 get_thread_area 和 Windows 下的 TlsAlloc/TlsGetValue,这两种方法的开销要么仅在首次访问 (Linux) 时产生,但在其他情况下是“免费”的,要么在每次访问 (Windows) 时产生显着的开销。 替代方法包括从线程环境块获取指针并进行表查找(这也是TlsGetValue 函数在内部执行的操作)或拥有一个单独的可写静态数据段,在访问时按线程选择(这就是用于实现例如errno 多年),或者只是在程序启动时在堆栈底部保留一个小区域,因为堆栈上的任何内容都定义为线程本地的。

您的特定编译器版本究竟使用了哪种方法,只有通过编译和反汇编程序(或通过挖掘编译器源代码)才能知道。 您将遇到的开销可能范围从“只有两个内存访问而不是一个”到一个函数调用,然后是一到两打指令,甚至在最坏的情况下甚至是一个系统调用。

【讨论】:

以上是关于oracle中的SQL的connect by是做啥用的的主要内容,如果未能解决你的问题,请参考以下文章

Oracle PL/SQL CONNECT BY PRIOR ... SQL Server 中的 START WITH 语句

oracle 中Session是做啥的?

oracle里的DBLINK是做啥的

oracle SQL查询时提示 用户数据中的connect by 循环 报错是啥原因?

gcc __thread 是做啥的?

sql server怎么实现oracle的connect by