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

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

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 如何写?

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 ...

查两次挺好的

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