数据库 SQL 嵌套查询语句求助~

michael_roshen · 2016年06月16日 · 最后由 michael_roshen 回复于 2016年06月18日 · 1878 次阅读

h1. 需求表(A)

h1. 数据表(B)

根据表A 里面的internalname, worktime关联B表,并随机取出关联后的数据(数量为A表中的hx)

举例:

id-- internalname| 3-- abc 5-- abc 6-- abc

A表中abc对应的xh为3,所以随机取出B表中的三条记录 A表中ccc对应的xh为0, 所以不取

请教sql如何写?

共收到 7 条回复
1楼 已删除

这个问题有意思~~

可以先搞定如何不用limit关键字实现limit

set @i = 0; select @i := @i + 1 AS sort_id, id from users where @i < 5;
Query OK, 0 rows affected (0.00 sec)

+---------+-----+
| sort_id | id  |
+---------+-----+
|       1 | 194 |
|       2 |   1 |
|       3 |   5 |
|       4 |   6 |
|       5 |   7 |
+---------+-----+
5 rows in set (0.00 sec)

同理:

SET @i = 0;SELECT @i := @i +1 AS i, B.id, B.internalname FROM B  INNER JOIN A ON B.internalname = A.internalname AND A.hx > @i WHERE internalname = 'abc';
3楼 已删除

嵌套查在 pg 不一定慢

select *, (
  select array(
    select id from "B"
    where "B".internalname = "A".internalname and "B".worktime = "A".worktime
    order by random()
    limit "A".xh
  )
) from "A"

更快的取样可以上 tablesample clause, 不过限制是只能用于 table 和 materialized views

#2楼 @hooopo 有两个问题:

  1. 利用了A表的hx,但是这样不能实现随机
  2. 本想一次查询,把匹配上的结果根据A表的hx,获取随机的条数,而不是每次指定internalname 不知道能否实现

#4楼 @luikore

select * from B  join person on  B.name = B.name and  B.worktime = A.worktime    order by rand() limit A.hx;

A.hx取不到

#6楼 @michael_roshen 不知道你这个是 xh 还是 hx ...

查两次挺好的

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册