2010-04-01 26 views

回答

2

下面是Postgres的一個例子,我希望方言的問候可比遞歸

WITH RECURSIVE t(n) AS (
    VALUES (1) 
    UNION ALL 
    SELECT n+1 FROM t WHERE n < 20 
) 
SELECT n FROM t; 

...將返回20條記錄,編號從1到20 演員/轉換這些以日期有你是

UPDATE: 對不起,沒有ORA這裏,但根據本article

SELECT 
    SYS_CONNECT_BY_PATH(DUMMY, '/') 
FROM 
    DUAL 
CONNECT BY 
    LEVEL<4; 

給出

SYS_CONNECT_BY_PATH(DUMMY,'/') 
-------------------------------- 
/X 
/X/X 
/X/X/X 

還聲明這應該是生成行的非常有效的方式。 如果ROWNUM可以在上面的選擇中使用,並且如果變量可以在LEVEL條件下使用,那麼可以計算出解決方案。

UPDATE2:

確實也有幾個options

SELECT (CAST('01-JAN-2010' AS DATE) + (ROWNUM - 1)) n 
FROM (SELECT 1 just_a_column 
     FROM dual 
     CONNECT BY LEVEL <= 20 
     ) 

orafaq指出:「應當指出的是,在以後的版本的Oracle,至少可以追溯到10gR1,對雙操作進行了優化,使得它們不需要邏輯或物理I/O操作。這使他們相當快。',所以我可以說這不完全是深奧的。

+0

yikes,我不知道從哪裏開始將這種語法翻譯成PL/SQL,不過很好! – ninesided 2010-04-01 10:02:17

+0

hm現在沒有ORA,但是如果CONNECT BY能夠使用ROWNUM並終止它,那麼它可能類似於SELECT ROWNUM作爲sq,1作爲child,1作爲父FROM FROM通過之前的child = parent連接和rownum <= 20; (但我不認爲這可能是由於騎車造成的)http://www.adp-gmbh.ch/ora/sql/connect_by.html – Unreason 2010-04-01 12:45:57

+0

好的工作不合理的是,CONNECT BY LEVEL語法聞起來像是一場勝利! – ninesided 2010-04-01 14:19:50

-1

號查詢只可以退貨現有的數據 - 如果你沒有所有日子的表格,你就出去了。

這說(我不是oracle專家),一個函數或存儲過程應該能夠做到這一點。在SQL Server中,我將有一個函數返回一個表(然後我可以在連接中使用)。

但純粹的查詢 - 沒有。除非oracle有這樣的功能,否則不是。

+0

你對現有數據有什麼意義? – systempuntoout 2010-04-01 08:50:01

+0

是的,但有雙重性和遞歸性:D – Unreason 2010-04-01 09:15:39

+0

-1 - 在Oracle中,您可以生成您希望的任何數據,例如,使用經典的'從RUALUM FROM DUAL CONNECT BY LEVEL <= n',或者對於更復雜的數據集,使用流水線函數。如果您可以考慮一種算法來生成數據,則可以在Oracle中編寫一個查詢來生成它。 – 2010-04-03 08:17:40

0

OK,所以它可能看起來有點哈克,但這裏是我想出來的:

SELECT (CAST('01-JAN-2010' AS DATE) + (ROWNUM - 1)) AS the_date 
FROM all_objects 
WHERE ROWNUM <= CAST('20-JAN-2010' AS DATE) - CAST('01-JAN-2010' AS DATE) + 1 

神奇的調料使用ROWNUM作爲日期計算的種子,我使用all_objects但你可以使用任何有足夠行的表來提供所需的範圍。您可以將其拖動到SYSDATE而不是硬編碼價值,但原則上我認爲這個想法是合理的。

下面是返回的日期從10天前到10天的時間列表的例子:

SELECT (SYSDATE -10 + (ROWNUM-1)) AS the_date 
FROM all_objects 
WHERE ROWNUM <= (SYSDATE +10) - (SYSDATE -10) + 1 
3

下面的查詢將返回1/1和1/20(含)之間的每一天。

select to_date('1/1/2010','mm/dd/yyyy')+level 
     from dual 
connect by level <= to_date('1/20/2010','mm/dd/yyyy') 
        - to_date('1/1/2010','mm/dd/yyyy'); 
相關問題