フォーラムに表示されることがより困難SQL問題:23(ランダム質問でいっぱい)

オリジナル: フォーラムに表示されるように、より困難なSQLの問題:23(ランダム質問でいっぱい)

最近では、フォーラムでは、私は彼らが解決することができますが、多くの困難なSQLの問題に会ったが、数日後、彼らはの溶液を忘れて、覚えていないことができました。

だから、私は出会いの後にこの問題ことを再度、記録する必要性を感じる、との考えから回答を得ることができます。


1、SQL文言のセクション、方法を求めて!

http://bbs.csdn.net/topics/390705441


選択* K11は10のレコード持っているから

files1 files2 files3 files4
AA BB CC DD
ZZ TT YY EE
NN MM GG UU

別のテーブルのユーザーを99件の記録、内部のユーザーテーブルの今のランダムランダムに選択された3つのレコード
を選択トップ3 NEWID ()ランダム、[ユーザーID]を[ユーザー]から
ランダムユーザーID
E81A4DBB
F31B3B6C
16574317 ティン

均等テーブル上K11上の表に結果のユーザーuserid値、最終的な結果を以下に示す

files1 files2 files3 files4ユーザーID
A1 BB CCを明DD
A2 TT EE YY玲
A3 MM GG UU玲
A4 XX XX XX明
A5 XX XX XX玲
A6 XX XX XXティン
A7 XX XX XX明
A8 XX XX XX玲
A9 XX XX XX玲
A10 XX XX XX明


SQLコード:


   
   
  1. create table k11(
  2. files1 varchar( 10),
  3. files2 varchar( 10),
  4. files3 varchar( 10),
  5. files4 varchar( 10),
  6. UserId varchar( 10))
  7. insert into k11
  8. select 'A1', 'BB', 'CC', 'DD', 'ming' union all
  9. select 'A2', 'EE', 'TT', 'YY', 'ling' union all
  10. select 'A3', 'MM', 'GG', 'UU', 'Ting' union all
  11. select 'A4', 'XX', 'XX', 'XX', 'ming' union all
  12. select 'A5', 'XX', 'XX', 'XX', 'ling' union all
  13. select 'A6', 'XX', 'XX', 'XX', 'Ting' union all
  14. select 'A7', 'XX', 'XX', 'XX', 'ming' union all
  15. select 'A8', 'XX', 'XX', 'XX', 'ling' union all
  16. select 'A9', 'XX', 'XX', 'XX', 'Ting' union all
  17. select 'A10', 'XX', 'XX', 'XX', 'ming'
  18. create table [ user]
  19. (
  20. UserId varchar( 10)
  21. )
  22. insert into [ user]
  23. select 'ming' union all
  24. select 'ling' union all
  25. select 'Ting'
  26. go
  27. ;with t
  28. as
  29. (
  30. select [UserId],
  31. ROW_NUMBER() over( order by newid()) as rownum
  32. from [ User]
  33. ),
  34. tt
  35. as
  36. (
  37. select *,
  38. case when rownum1 % 3 = 0 then 3 else rownum1 % 3 end as rownum
  39. from
  40. (
  41. select *,
  42. ROW_NUMBER() over( order by getdate()) as rownum1
  43. from k11
  44. )a
  45. )
  46. select tt.files1,tt.files2,tt.files3,tt.files4,t.UserId
  47. from tt
  48. left join t
  49. on tt.rownum = t.rownum
  50. and t.rownum <= 3
  51. /*
  52. files1 files2 files3 files4 UserId
  53. A1 BB CC DD ming
  54. A2 EE TT YY ling
  55. A3 MM GG UU Ting
  56. A4 XX XX XX ming
  57. A5 XX XX XX ling
  58. A6 XX XX XX Ting
  59. A7 XX XX XX ming
  60. A8 XX XX XX ling
  61. A9 XX XX XX Ting
  62. A10 XX XX XX ming
  63. */

2、ランダムなデータは、100を返します。

テーブルが比較的大きい場合には、データ数千万のは、コードによって、あなたがない真にランダムの意味で、ランダムなここ100のランダムなデータを、返すことができ、そこにあるが、それは、人々が感じさせるが、あること、あなたが戻るたびにランダムでありませんデータは、キーが0秒に近いだけで62ミリ秒を消費し、非常に高速であり、同じではありません。


   
   
  1. select *
  2. from
  3. (
  4. select *,
  5. ROW_NUMBER() over( order by @@servername) as rownum
  6. from dbo.xxx
  7. )t
  8. where rownum between CHECKSUM( getdate()) % 10000 and CHECKSUM( getdate()) % 10000+ 99


SQL Server 分析和编译时间: 
   CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。

(100 行受影响)

 SQL Server 执行时间:
   CPU 时间 = 0 毫秒,占用时间 = 62 毫秒。



公開された416元の記事 ウォンの賞賛135 ビュー940 000 +

おすすめ

転載: www.cnblogs.com/lonelyxmas/p/12020040.html