没有预先连接

时间:2016-04-22 16:04:42

标签: sql oracle

我遇到了一个查询来创建像这样的虚拟表

CREATE TABLE destination AS
SELECT level AS id,
       CASE
         WHEN MOD(level, 2) = 0 THEN 10
         ELSE 20
       END AS status,
       'Description of level ' || level AS description
FROM   dual
CONNECT BY level <= 10;

SELECT * FROM destination;

         1         20 Description of level 1
         2         10 Description of level 2
         3         20 Description of level 3
         4         10 Description of level 4
         5         20 Description of level 5
         6         10 Description of level 6
         7         20 Description of level 7
         8         10 Description of level 8
         9         20 Description of level 9
        10         10 Description of level 10

10 rows selected.

您能否分享一些有关其如何运作的见解?首先,PRIOR的缺失对我来说并不为人所知。其次,我不了解树的构造方式。从级别来看,它们看起来都是从同一个根分支出来的。

1 个答案:

答案 0 :(得分:4)

这个噱头被DB专业人士Mikito Harakiri注意到,并在AskTom上分享。它已经在Oracle社区中被采用,虽然它没有文档(它实际上违背了文档),并且它的使用有点危险,因为Oracle可能在某些时候使它不再起作用。 (虽然已经大量使用,但甲骨文收回它将是疯狂的。)

这些行确实是从同一个根分支出来的,双行是单行。您可以使用任何其他具有完全一行的表来执行相同的操作。如果你从两行开始(或者你在自己的表上使用这个技巧,有很多行),你很快就会遇到麻烦。有很多方法,随着时间的推移你会选择它。您可能有兴趣关注Oracle论坛,在OTN,人们会一直使用这个技巧。

以下是一篇讨论此技巧的文章:http://www.sqlsnippets.com/en/topic-11821.html