如何将随机值从一个表插入到另一个表(oracle sql)?
我有两个表,一个是客户机,其中我有主键:ClientID integer type。另一个表是Orders,其中我有外键:idClient。我想将随机数据生成到订单中,但idClient也应该是来自客户端的ClientID号 以下是我写的:如何将随机值从一个表插入到另一个表(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
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