2014-01-24 50 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以下的样品。对于许多目的而言,这样的样本与随机样本一样好,甚至更好。