最近遇到一个测试数据的需求,需要往一个表中插入4个来源的数据。
往orders 表中插入 来自
- sql_person
- cm_user_car_model
- cm_sp_product_new
- 部分固定数据以及两个递增的时间数据
对于4的数据很好处理不过是时间处理,以及固定值的递增。
对于1,2,3部分,第一眼想到的是用cross join来去三个表的笛卡尔积,三个表各取一条拼合在一起插入
例如select a.*,b.*,c.* from (select * from t1 where... limit 1 ) a
join (select * from t2 where... limit 1 )b
Join (select * from t3 where... limit 1 )c
由于没有明确的对应条件,也就没有办法将结果集一一对应,一次性插入(仔细想想应该也可以,不过我将4部分的数据放在a中一起插入,由于递增的需求我只能一天一天的插入)
但是发现 由于 b,c的结果集可能为 null 导致插入数据的时候发生错误,而limit 1 也无法实现在 select * from t2 where...的结果集中随机取一条的目的。。
我改变了一次性插入的策略,选择先插入一条数据,然后通过
LAST_INSERT_ID()(由于是测试库,只有我一个人再用)等方法获取刚插入的数据自增id,通过自增id来update刚刚插入的数据行。
这样就解决了插入条数的问题,不会因为某个子查询为空而使得三个表的join结果也为空了。
但是子查询结果集中随机取一条并没有实现。Limit 1没有解决我的需求,每一次取出来的都是同一条数据,由于mysql 表没有提供rownum,所以实现起来没有oracle那么水到渠成。网络上提供了一种在查询之中加入一个自实现的’rownum’值,再在查询外嵌套一层的查询来将随机的rownum值取得。
这里可以在查询中加入一个新的随机数字段 ra,通过order by ra 来获取一个随机字段。
SELECT
RAND() as ra,
repay_month,
model_id,
car_price
FROM
cm_user_car_model
order by ra
limit 1
这样显的更加简洁。