经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » MS SQL Server » 查看文章
单词随机连接三个词组
来源:cnblogs  作者:刀奈特程序员  时间:2018/11/20 17:38:15  对本文有异议

  闲来无事刷技术论坛,看到一个这样的问题:

  1. 我现在有个表,里面有100个不同的单词,每个单词对应有大概20个词组,我想通过sql,每个单词随机获取对应的3个词组,请问怎么写可以实现?

  感觉题材很新颖,角度很刁钻,从业至今还未碰到过类似需求,今日反正也是闲着,索性解答一番。首先当然是生成测试数据。

  1. --单词表
  2. CREATE TABLE [dbo].[DanCiBiao](
  3. [BH] [int] IDENTITY(1,1) NOT NULL primary key,
  4. [DanCi] [nvarchar](100) NOT NULL
  5. )
  6. --词组表
  7. CREATE TABLE [dbo].[CiZuBiao](
  8. [BH] [int] IDENTITY(1,1) NOT NULL primary key,
  9. [DanCiBH] [int] NOT NULL,
  10. [CiZu] [nvarchar](100) NOT NULL
  11. )
  12. --插入测试数据。
  13. --为了方便生成数据,没有真的使用单词和词组,而是选择了替代方案。
  14. declare @BL nvarchar(100)
  15. declare @XL int
  16. declare @CiZu nvarchar(100)
  17. declare @XLCZ int
  18.  
  19. set @BL='A'
  20. set @XL=0
  21.  
  22. while @XL<100
  23. begin
  24. set @XL=@XL+1
  25. set @BL=@BL+CAST (@XL as nvarchar(100))
  26. set @XLCZ=0
  27. set @CiZu=@BL
  28.  
  29. insert into DanCiBiao(DanCi) values(@BL)
  30. while @XLCZ<20
  31. begin
  32. set @XLCZ=@XLCZ+1
  33. set @CiZu=@CiZu+'_'+ CAST(@XLCZ as nvarchar(100))
  34. INSERT INTO CiZuBiao(DanCiBH,CiZu) values(@XL,@CiZu)
  35. set @CiZu=@BL
  36. end
  37.  
  38.  
  39. set @BL='A'
  40. end
  1. --第一种解决方案:SQL批处理
  2. create table #LinShiBiao(
  3. SuiJiShu int not null
  4. )
  5. insert into #LinShiBiao (SuiJiShu) select cast(rand()*20+1 as int)
  6. insert into #LinShiBiao (SuiJiShu) select cast(rand()*20+1 as int)
  7. insert into #LinShiBiao (SuiJiShu) select cast(rand()*20+1 as int)
  8. select A.DanCi,A.CiZu
  9. from (SELECT ROW_NUMBER() OVER(PARTITION BY A.DanCi order by B.BH) as BH, A.DanCi,B.CiZu
  10. FROM DanCiBiao A
  11. inner join CiZuBiao B on A.BH=B.DanCiBH ) A
  12. inner join #LinShiBiao B on A.BH=B.SuiJiShu
  13. drop table #LinShiBiao
  1. --第二种解决方案
  2. select A.DanCi,A.CiZu
  3. from (SELECT ROW_NUMBER() OVER(PARTITION BY A.DanCi order by B.BH) as BH, A.DanCi,B.CiZu
  4. FROM DanCiBiao A
  5. inner join CiZuBiao B on A.BH=B.DanCiBH) A
  6. inner join (select cast(rand()*20+1 as int) as BH,cast(rand()*20+1 as int) as BH2,cast(rand()*20+1 as int) as BH3) B on A.BH=B.BH2 or A.BH=B.BH3 or A.BH=B.BH

结果如图:

 

写作时间:2018-11-20

=====================================================================================

本文只代表本人的见解,可能存在错误,仅用于技术交流。如果你喜欢该文,可以扫下面的二维码打赏我(打赏敬请备注“博客园打赏”五字)。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号