2014-01-24 80 views
1

我運行下面的代碼範圍內具有固定值的隨機數。對於每次執行,我都會收到我的查詢結果。但是對於每次執行它都會給我SUPPLIER_ID的不同隨機值。我希望每次修復SUPPLIER_ID的值。請幫我解決一下這個。如何生成SQL

SELECT 
    T.*, 
    C.*, 
    LC.SUPPLIER_NAME, 
    L.LOCAL_COMMODITY_DESC, 
    CASE WHEN C.INVOICE_DESCRIPTION IS NULL 
    THEN 'NO' 
    ELSE 'YES' END AS DEPEND_OTHER 
FROM OYSTER_WEB3.TRANSACTION T, 
Local_Feed_Commodity_Map L, 
OYSTER3.CAT_RULE_MV C, 
OYSTER3.LOCAL_COMMON_SUPPLIER_MAP LC 
    WHERE 
    C.CAT_RULE_ID=T.CAT_RULE_ID 
    AND 
    C.DATA_FEED_CODE=LC.DATA_FEED_CODE 
    AND 
    T.SUPPLIER_CODE=C.LOCAL_SUPPLIER_CODE 
    AND 
    C.LOCAL_SUPPLIER_CODE=LC.SUPPLIER_CODE 
    AND 
    T.DATA_FEED_CODE=L.DATA_FEED_CODE 
    AND 
    C.LOCAL_COMMODITY_CODE=L.LOCAL_COMMODITY_CODE 
    AND 
    L.Local_Commodity_Code =   (SUBSTR(T.LOCAL_COMMODITY_CODE,1,INSTR(T.LOCAL_COMMODITY_CODE,'~')-1)) 
    AND T.TRANSACTION_DATE>='01-JAN-09' 
    AND LC.SUPPLIER_ID IN 
    (select trunc(dbms_random.VALUE(21852,2268730)) num from dual CONNECT BY LEVEL<=200); 
+0

如果它是隨機的,它如何被固定?你的意思是你想暫時讓它與測試一致嗎? –

+0

如果你想每次都使用相同的號碼,爲什麼不使用你選擇的號碼呢? – Mihai

+0

它可以修復。我知道它可以使用SEED修復。但我無法做到這一點。同樣的隨機號碼序列。每次都可以生成相同的值。 – user3231684

回答

2

不太確定在理解爲什麼你想要一個固定的隨機數範圍,但如果你這樣做,你需要種子。通常,兩個呼叫會得到不同的結果:

select trunc(dbms_random.VALUE(21852,2268730)) num from dual CONNECT BY LEVEL<=5; 

     NUM 
---------- 
    1691967 
    1536691 
    221687 
    1925527 
    793133 

select trunc(dbms_random.VALUE(21852,2268730)) num from dual CONNECT BY LEVEL<=5; 

     NUM 
---------- 
    1316523 
    1121136 
    1011501 
    242015 
    2182176 

如果reset the seed value之前調用每一個你會得到相同的結果:

exec dbms_random.seed(42); 
select trunc(dbms_random.VALUE(21852,2268730)) num from dual CONNECT BY LEVEL<=5; 

     NUM 
---------- 
    195911 
    1291100 
    1478849 
    1426372 
    784607 

exec dbms_random.seed(42); 
select trunc(dbms_random.VALUE(21852,2268730)) num from dual CONNECT BY LEVEL<=5; 

     NUM 
---------- 
    195911 
    1291100 
    1478849 
    1426372 
    784607 

operational notes解釋:

DBMS_RANDOM可以明確地初始化,但不需要在調用隨機數發生器之前初始化爲 。如果沒有 執行顯式初始化,它將自動使用日期,用戶標識和進程標識初始化 。

如果這個包使用相同的種子播種兩次,然後以相同的方式在 中訪問,它將在兩種情況下產生相同的結果。

在某些情況下,例如在測試時如,你可能想 隨機數序列是在每次運行相同。在這種情況下,可以通過調用的 DBMS_RANDOM.SEED重載的一個種子的 發生器具有恆定值。爲了產生不同的輸出每次運行,只是省略 調用「種子」,系統將選擇一個合適的種子 你。

4

另一種方法是使用rownum生成僞隨機數。你需要把你的當前查詢的CTE(使用with)或一個子查詢並生成rownum作爲列名(比如seqnum)與order by條款(所以它總是產生相同的結果):

select rownum as seqnum . . . 
order by <whatever> 

然後在外部查詢中,您可以使用seqnum來選擇行。舉例來說,如果你想約10%,你可以這樣做:

mod(seqnum*101-87, 101) = 17; 

我只是用含質數的表現。如果你喜歡,你可以做出更復雜的表達。

這實際上給出1-外的n以下的樣品。對於許多目的而言,這樣的樣本與隨機樣本一樣好,甚至更好。