sql—使用cte检索随机记录

8ljdwjyq  于 2021-07-26  发布在  Java
关注(0)|答案(2)|浏览(417)

我发现了下面的代码,工作正常。有没有人能建议一种方法,我可以把locations表集成到cte中,这样我就可以在每一行中获得一个随机的location\u id。我怀疑我需要另一个工会,但我不知道如何获得随机位置的身份证
在本例中,位置表是连续排序的,以便于过帐,但并非始终如此。

  1. CREATE TABLE schedule_hdr AS
  2. SELECT level AS schedule_id,
  3. 'Schedule ' || level AS schedule_name
  4. FROM dual
  5. CONNECT BY level <= 2;
  6. CREATE TABLE locations AS
  7. SELECT level AS location_id,
  8. 'Door ' || level AS location_name,
  9. CASE round(dbms_random.value(1,3))
  10. WHEN 1 THEN 'A'
  11. WHEN 2 THEN 'T'
  12. WHEN 3 THEN 'G'
  13. END AS location_type
  14. FROM dual
  15. CONNECT BY level <= 25;
  16. ALTER TABLE locations
  17. ADD ( CONSTRAINT location_id_pk
  18. PRIMARY KEY (location_id));
  19. WITH random_times ( schedule_id, datetime, lvl ) AS (
  20. SELECT schedule_id,
  21. TRUNC(sysdate)
  22. +
  23. NUMTODSINTERVAL( FLOOR(DBMS_RANDOM.VALUE(0,23*60)), 'MINUTE' ),
  24. 1
  25. FROM schedule_hdr
  26. UNION ALL
  27. SELECT schedule_id,
  28. datetime + NUMTODSINTERVAL(FLOOR(DBMS_RANDOM.VALUE(6,11)), 'MINUTE'),
  29. lvl + 1
  30. FROM random_times
  31. WHERE lvl < 5
  32. )
  33. SELECT schedule_id,
  34. datetime
  35. FROM random_times
  36. ORDER BY schedule_id, datetime;
col17t5w

col17t5w1#

以下是您想要的:

  1. WITH random_times ( schedule_id, datetime, lvl ) AS (
  2. SELECT schedule_id,
  3. TRUNC(sysdate)
  4. +
  5. NUMTODSINTERVAL( FLOOR(DBMS_RANDOM.VALUE(0,23*60)), 'MINUTE' ),
  6. 1
  7. FROM schedule_hdr
  8. UNION ALL
  9. SELECT schedule_id,
  10. datetime + NUMTODSINTERVAL(FLOOR(DBMS_RANDOM.VALUE(6,11)), 'MINUTE'),
  11. lvl + 1
  12. FROM random_times
  13. WHERE lvl < 5
  14. )
  15. SELECT
  16. schedule_id,
  17. datetime,
  18. loc.*
  19. FROM random_times
  20. ,locations loc
  21. where loc.location_id = (
  22. select location_id
  23. from locations
  24. -- you need this predicate to disable subquery caching:
  25. where location_id*0 = schedule_id*0+lvl*0
  26. order by dbms_random.value()
  27. fetch first 1 row only
  28. )
  29. ORDER BY schedule_id, datetime;
展开查看全部
wnrlj8wa

wnrlj8wa2#

从这个代码片段中很难知道发生了什么,但是如果您的目标是从具有数据的基表中以随机顺序使用数据来播种新表,则可以考虑生成随机值,然后按它们的行号排序,从而为自己提供一个伪主键(整数,递增):

  1. SELECT
  2. t.*,
  3. row_number() over(order by dbms_random.value(1,10)) as pseudopk
  4. FROM
  5. table

例如,您有如下基本数据表(或cte):

  1. BasePerson
  2. Name, Age
  3. --------
  4. John, 20
  5. Mary, 30
  6. BaseAddress
  7. City
  8. ----
  9. New York
  10. Paris
  11. Berlin
  12. INSERT INTO RealAddress(ID, City)
  13. SELECT * FROM
  14. (
  15. SELECT row_number() over(order by dbms_random.value(1,10)) pk, a.City
  16. FROM BaseAddress
  17. )
  18. WHERE pk < 3 --2 people need 2 address
  19. INSERT INTO RealPerson(ID, Name, Age, AddressID)
  20. SELECT pk, Name, Age, pk
  21. FROM(
  22. SELECT
  23. row_number() over(order by dbms_random.value(1,10)) pk,
  24. a.Name,
  25. a.Age
  26. FROM BasePerson
  27. )

我们重用个人id和地址id的数字其实并不重要,因为地址数据在插入时是随机的,所以这是“相对于pk的随机顺序中的人,以相对于地址pk的随机顺序链接到地址”

展开查看全部

相关问题