如何将随机值从一个表插入到另一个表(oracle sql)?

如何将随机值从一个表插入到另一个表(oracle sql)?,sql,oracle,oracle11g,Sql,Oracle,Oracle11g,我有两个表,一个是客户机,其中我有主键:ClientID integer type。另一个表是Orders,其中我有外键:idClient。我想将随机数据生成到订单中,但idClient也应该是来自客户端的ClientID号 以下是我写的: INSERT INTO Orders SELECT level AS OrderID, (SELECT * FROM (SELECT ClientID FROM Clients ORDER BY DBMS_RANDOM.VALUE) WHERE ROW

我有两个表,一个是客户机,其中我有主键:ClientID integer type。另一个表是Orders,其中我有外键:idClient。我想将随机数据生成到订单中,但idClient也应该是来自客户端的ClientID号

以下是我写的:

INSERT INTO Orders
SELECT level AS OrderID,
   (SELECT * FROM (SELECT ClientID FROM Clients ORDER BY DBMS_RANDOM.VALUE) WHERE ROWNUM = 1) AS idClient,
   DBMS_RANDOM.string('L',TRUNC(DBMS_RANDOM.value(2,50))) AS ProductName,
   TRUNC(SYSDATE + DBMS_RANDOM.value(0,366)) AS Date,
   TRUNC(DBMS_RANDOM.value(15,2000)) AS Price
FROM   dual
CONNECT BY level <= 200;
COMMIT;
问题是,当我查看订单中生成的记录时,我在idClient中的每一行都有相同的编号,例如每一行有24个。我想要从ClientID中选择不同的号码

如何修复它


提前感谢。

您可以根据需要交叉连接客户机表,以获得足够的样本行,从该查询中选择有效ID,然后在外部查询中添加所有其他随机列。示例另见:

桌子

create table clients ( id, name )
as
select 101, 'client_101' from dual union all
select 202, 'client_202' from dual union all
select 303, 'client_303' from dual union all
select 404, 'client_404' from dual union all
select 505, 'client_505' from dual union all
select 606, 'client_606' from dual union all
select 707, 'client_707' from dual union all
select 808, 'client_808' from dual union all
select 909, 'client_909' from dual ;

alter table clients add constraint pkey_clients primary key ( id ) ;

create table orders (
  id number primary key
, idclient number references clients ( id )
, productname varchar2( 256 )
, orderdate date
, price number( 12, 2 )
);
从选择插入

insert into orders ( id, idclient, productname, orderdate, price )
select 
  rownum
, idclient
, dbms_random.string( 'L', trunc( dbms_random.value( 2, 50 ) ) ) as productname
, trunc( sysdate + dbms_random.value( 0, 366 ) ) as orderdate
, trunc( dbms_random.value( 15, 2000 ) ) as price 
from 
(
  select 
    C1.id  idclient
  from clients C1, clients C2, clients C3  -- cross join -> 9*9*9 rows
  order by dbms_random.value 
) where rownum <= 200 ;                    -- stop inserting at row 200

200 rows inserted.
更新

如果有多个源表需要从中获取ID(如注释中所述),只需在交叉联接中使用所有相关的表名即可。例如:

-- 3 parent tables ("sources" of ids)
create table src1 ( id number primary key ) ;

insert into src1( id ) 
select level + 3000 as id
from dual connect by level <= 5 ;

create table src2 ( id number primary key ) ;

insert into src2( id ) 
select level + 4000 as id
from dual connect by level <= 5 ;

create table src3 ( id number primary key ) ;

insert into src3( id ) 
select level + 5000 as id
from dual connect by level <= 5 ;

-- 1 child table with 3 foreign key constraints
create table dest (
  id number generated always as identity start with 1000 primary key
, src1id number references src1( id )
, src2id number references src2( id )
, src3id number references src3( id )
, shipmentstatus number not null
  check( shipmentstatus in ( 0, 1 ) )
); 

如果交叉连接。。。从src1,src2,src3。。。没有给您足够的行,只需再次运行查询。

非常感谢!如果我想添加更多外键,例如:idproduct和idshipment,我应该如何将其放在那里?我在begging添加了这些id,就像idclient一样,然后:从客户C1中选择C1.id idclient,客户C2,客户C3按dbms_random.value订购,从产品P1中选择P1.id idproduct,产品P2,产品P3按dbms_random.value订购,从发货S1中选择S1.id idshipment,发货S2,发货S3按dbms_random.value排序,其中rownum@Anna-欢迎您!您在注释中向代码中写入了太多交叉连接,如果您让它正常工作,可能会产生大量行。简化它看上面更新中的例子。现在看起来很容易理解,我把它复杂化了:D我还有最后一个问题。我有一个参数shipmentStatus-smallint-type,如果未发送装运,我想将其设置为0,如果已发送,则设置为1。但当我这样做时:TRUNC DBMS_RANDOM.value 0,1,sql表示该值不能为null,所以我假设这是0的错误。有没有办法修复它?@Anna-NULL并不意味着0。如果您想在测试表中随机设置0和1,可以使用MOD。我在示例中添加了SHIPMENTSTATUS列。我不会使用TRUNC DBMS_RANDOM.VALUE来获取0和1,再次非常感谢!:
-- 3 parent tables ("sources" of ids)
create table src1 ( id number primary key ) ;

insert into src1( id ) 
select level + 3000 as id
from dual connect by level <= 5 ;

create table src2 ( id number primary key ) ;

insert into src2( id ) 
select level + 4000 as id
from dual connect by level <= 5 ;

create table src3 ( id number primary key ) ;

insert into src3( id ) 
select level + 5000 as id
from dual connect by level <= 5 ;

-- 1 child table with 3 foreign key constraints
create table dest (
  id number generated always as identity start with 1000 primary key
, src1id number references src1( id )
, src2id number references src2( id )
, src3id number references src3( id )
, shipmentstatus number not null
  check( shipmentstatus in ( 0, 1 ) )
); 
insert into dest( src1id, src2id, src3id, shipmentstatus )
select src1id, src2id, src3id, mod( src1id, 2 ) shipmentstatus
-- generate more data as required
-- , dbms_random.string( 'L', trunc( dbms_random.value( 2, 30 ) ) ) as productname
-- , trunc( sysdate + dbms_random.value( 0, 366 ) ) as orderdate
-- , trunc( dbms_random.value( 15, 2000 ) ) as price  
from ( 
  select 
    A.id src1id 
  , B.id src2id 
  , C.id src3id         
  from src1 A, src2 B, src3 C
  order by dbms_random.value
)
where rownum <= 200
;
select * from dest fetch first 12 rows only ;

ID    SRC1ID  SRC2ID  SRC3ID  SHIPMENTSTATUS  
1000  3004    4005    5002    0               
1001  3001    4004    5001    1               
1002  3004    4001    5002    0               
1003  3001    4003    5003    1               
1004  3004    4005    5005    0               
1005  3003    4001    5003    1               
1006  3003    4003    5001    1               
1007  3001    4002    5003    1               
1008  3004    4001    5004    0               
1009  3005    4002    5003    1               
1010  3004    4005    5003    0               
1011  3002    4002    5001    0