MS SQL: newID () рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЫрджреНрдо рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдбреЗрдЯрд╛ рдкреАрдврд╝реАред рд╕реБрд╡рд┐рдзрд╛рдПрдБ рдФрд░ рдиреБрдХрд╕рд╛рди

рдпрд╣ рдЬреНрдЮрд╛рдд рд╣реИ рдХрд┐ рдмрд┐рд▓реНрдЯ-рдЗрди рдлрдВрдХреНрд╢рди рдиреНрдпреВрдЖрдИрдбреА () рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рджреНрд╡рд╛рд░рд╛ рди рдХреЗрд╡рд▓ рдЕрдкрдиреЗ рдЗрдЪреНрдЫрд┐рдд рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдЕрд░реНрдерд╛рдд, рдЕрджреНрд╡рд┐рддреАрдп рдкреНрд░рд╛рдердорд┐рдХ рдХреБрдВрдЬреА рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд▓реНрдХрд┐ рдПрдХ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд░реВрдк рдореЗрдВ рдЫрджреНрдо рдЖрдпрд╛рдореА рдбреЗрдЯрд╛ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред
рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ, newID () рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХрдорд╛рддреНрд░ рдРрд╕рд╛ рд╣реИ рдЬреЛ рди рдХреЗрд╡рд▓ рдЧреИрд░-рдирд┐рдпрддрд╛рддреНрдордХ рд╣реИ, рдмрд▓реНрдХрд┐ рд╕реБрдкрд░-рдЧреИрд░-рдирд┐рд░реНрдзрд╛рд░рдХ рднреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдмрд╛рдХреА рд╕рднреА рдХреЗ рд╡рд┐рдкрд░реАрдд, рдпрд╣ рдкреНрд░рддреНрдпреЗрдХ рдирдИ рдкрдВрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рдорд╛рди рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИ, рдФрд░ рдкреВрд░реЗ рдмреИрдЪ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рдирд╣реАрдВ рд╣реИ - рдЬреЛ рдЗрд╕ рддрд░рд╣ рдХреА рдмрдбрд╝реЗ рдкреИрдорд╛рдиреЗ рдкрд░ рдкреАрдврд╝реА рдХреЗ рд▓рд┐рдП рдмреЗрд╣рдж рдЙрдкрдпреЛрдЧреА рд╣реИред NewID () рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд, рдЗрд╕ рд╕рдВрдкрддреНрддрд┐ рдореЗрдВ newSequentialID () рднреА рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕рдХреЗ рдЙрдкрдпреЛрдЧ рдХрд╣реАрдВ рдФрд░ рд╣реИ, рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЯрд╛рдЗрдк рдпреВрдиреАрдХреЙрд▓реАрдлрд╛рдпрд░ рдХреЗ рдХреЙрд▓рдо рдХрд╛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рд╖рд┐рджреНрдз рд╣реИред
рдЖрдкрдХреЛ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рджреВрд░ рдирд╣реАрдВ рдЬрд╛рдирд╛ рд╣реИ - рдиреАрдЪреЗ рдХреЛрдб рд╣реИ:

SELECT TOP 100 ABS(CHECKSUM(NEWID())) % 1000 FROM sysobjects A CROSS JOIN sysobjects B 

рдпрд╛ рдпрд╣ рдПрдХ (рдпрджрд┐ рдЪреЗрдХрд╕рдо рдПрдХ рд╕рдордп рд▓реЗрдиреЗ рд╡рд╛рд▓реА рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИ):

 SELECT TOP 100 ABS(CONVERT(INT, (CONVERT(BINARY(4), (NEWID()))))) % 1000 FROM sysobjects A CROSS JOIN sysobjects B 

рдпрд╣ 0 рд╕реЗ 999 рддрдХ рдХреА рд╕реАрдорд╛ рдореЗрдВ 100 рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдкреВрд░реНрдгрд╛рдВрдХреЛрдВ рдХреА рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рдЙрддреНрдкрдиреНрди рдХрд░реЗрдЧрд╛ред

рдлрд╝реНрд▓реЛрдЯрд┐рдВрдЧ рдирдВрдмрд░реЛрдВ рдХреЗ рд▓рд┐рдП, рдЖрдк рдПрдХ рдкреВрд░реНрдгрд╛рдВрдХ рдХреЗ рд╕рд╛рде рдЬрдирд░реЗрдЯрд░ рдХреЛ рдЖрд░рдВрднреАрдХреГрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░реИрдВрдб () рдлрд╝рдВрдХреНрд╢рди рдкреНрд░реЙрдкрд░реНрдЯреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 SELECT TOP 100 RAND(CHECKSUM(NEWID())) FROM sysobjects A CROSS JOIN sysobjects B 

рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рд░реИрдВрдб () рдХреЛ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдЗрдВрдЯ 32 рд░реЗрдВрдЬ рд╕реЗ рд░реЗрдВрдЬ [0..1) рддрдХ рдПрдХ рдХрдирд╡рд░реНрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдПрдХ рд▓рд╛рдЦ рдХреЗ рдЖрджреЗрд╢ рдХреЗ рд░рд┐рдХреЙрд░реНрдб рдХреА рд╕рдВрдЦреНрдпрд╛ рдкрд░ рдЗрд╕ рдкрджреНрдзрддрд┐ рджреНрд╡рд╛рд░рд╛ рд╡рд┐рддрд░рдг рдХреА рдЧреБрдгрд╡рддреНрддрд╛ рдХрд╛ рд╕рд╛рдВрдЦреНрдпрд┐рдХреАрдп рд╕рддреНрдпрд╛рдкрди рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд░реИрдВрдб () рдХреЗ рдорд╛рдирдХ рдЙрдкрдпреЛрдЧ рд╕реЗ рдиреАрдЪ рдирд╣реАрдВ рд╣реИ, рдПрдХ рдмрд╛рд░ рдЖрд░рдореНрдн рдореЗрдВ, рдФрд░ рдлрд┐рд░ рд▓реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП - рдЖрдк рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдПрдХ рдФрд░ рджрд┐рд▓рдЪрд╕реНрдк рд╡рд┐рдХрд▓реНрдк рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рд╡рд┐рддрд░рд┐рдд рдбреЗрдЯрд╛ рдХреА рдкреАрдврд╝реА рд╣реИред рдпрд╣рд╛рдВ рд╣рдо рдмреЙрдХреНрд╕-рдореБрд▓рд░ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ:

 SELECT TOP 1000 COS(2 * PI() * RAND(BINARY_CHECKSUM(NEWID()))) * SQRT(-2 * LOG(RAND(BINARY_CHECKSUM(NEWID())))) FROM sysobjects A CROSS JOIN sysobjects B CROSS JOIN sysobjects C 

рдЬреЛ рд▓реЛрдЧ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рд╡реЗ рдпрд╣ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЙрддреНрдкрдиреНрди рд╡рд┐рддрд░рдг рд╕рд╛рдЬрд┐рд╢ рд░рдЪрдХрд░ рд╕рд╛рдорд╛рдиреНрдп рдХреЗ рдмрд╣реБрдд рдХрд░реАрдм рд╣реИред

рдпрд╣ рд╕рдм рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЖрдкрдХреЛ рдмрд╣реБрдд рдЬрд▓реНрджреА рд╕реЗ "рд╣реЗрдб-рдСрди" рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ рдХрдо рд╕реЗ рдХрдо рдПрдХ рджрд░реНрдЬрди рдорд┐рд▓рд┐рдпрди рд░рд┐рдХреЙрд░реНрдб рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рд▓реВрдк, рдХрд░реНрд╕рд░, рдпрд╛ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкрд░рдд рд╕реЗ рдПрдХ рдмрд╛рд░ рд░рд┐рдХреЙрд░реНрдб рджрд░реНрдЬ рдХрд░рдирд╛ред рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдкрдВрдХреНрддрд┐ рд╕реНрд░реЛрдд рдХреЗ рд░реВрдк рдореЗрдВ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдореЗрдВ рдкрд░реНрдпрд╛рдкреНрдд рдХреНрд╖рдорддрд╛ рд╣реИ, рдФрд░ рдпрд╛ рддреЛ CROSS JOINs рдХреА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╡реГрджреНрдзрд┐ рдХрд░реЗрдВ, рдпрд╛ рд╕реНрд░реЛрдд рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд╛рдВрдЫрд┐рдд рд╕рдВрдЦреНрдпрд╛ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рддрд╛рд▓рд┐рдХрд╛ рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╡рд┐рд╖рдп рдХреЗрд╡рд▓ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╣реИред рдЕрдзрд┐рдХрд╛рдВрд╢ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдЙрддреНрдкрдиреНрди рдкрдВрдХреНрддрд┐рдпрд╛рдБ рднреМрддрд┐рдХ рд╣реЛрддреА рд╣реИрдВ, рдЕрд░реНрдерд╛рдд, рдПрдХ рд╕реНрдерд┐рд░ рдпрд╛ рдЕрд╕реНрдерд╛рдпреА рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ, рдпрд╛ рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рдЪрд░ рдореЗрдВ рдбрд╛рд▓реА рдЬрд╛рддреА рд╣реИред рдпрджрд┐ рдРрд╕рд╛ рд╣реИ, рддреЛ рдЖрдк рдЖрдЧреЗ рдкрдврд╝рдирд╛ рдЫреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ - рднреМрддрд┐рдХ рдбреЗрдЯрд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдРрд╕реЗ рдорд╛рдорд▓реЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рдЙрдк-рд╡рд┐рд╡рд░рдгреЛрдВ рдореЗрдВ рдЙрдкрд░реНрдпреБрдХреНрдд рдмрдпрд╛рдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдФрд░ рдпрд╣рд╛рдБ, SQL рдЗрдВрдЬрди рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреА рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдЕрдХрдердиреАрдп рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИрдВред рдЖрдЗрдП рдЙрдиреНрд╣реЗрдВ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рджреЗрдЦреЗрдВ, рдФрд░ рдлрд┐рд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ рдХрд┐ рдРрд╕рд╛ рдХреНрдпреЛрдВ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдЗрд╕рд╕реЗ рдХреИрд╕реЗ рдирд┐рдкрдЯреЗрдВ:

рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд╕ рд╕рдм-рд╡реЗрд░реА рдореЗрдВ newID () рдХреЗ рд╕рд╛рде рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рд▓рд┐рдЦреЗрдВ рдФрд░ рдЗрд╕реЗ рдХрдИ рдмрд╛рд░ рд▓реВрдк рдореЗрдВ рдЪрд▓рд╛рдПрдВ:

 declare @c int = 0 while @c < 5 begin SELECT * FROM ( SELECT ABS(CONVERT(INT, CONVERT(BINARY(4), NEWID()))) % 5 AS RNDIDX FROM ( SELECT 1 AS ID ) ROWSRC ) SUBQ set @c = @c + 1 end 

рдХреЛрдб рдЕрдкреЗрдХреНрд╖рд┐рдд рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ - рдпрд╣ 5 рдкрд░рд┐рдгрд╛рдо рд╕реЗрдЯ рджреЗрддрд╛ рд╣реИ, рдкреНрд░рддреНрдпреЗрдХ рдХрдбрд╝рд╛рдИ рд╕реЗ 0 рд╕реЗ 4 рддрдХ рдХреА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдПрдХ рд░рд┐рдХреЙрд░реНрдб рд╣реЛрддрд╛ рд╣реИред рдореИрдВ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХрд╛ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдирд╣реАрдВ рджреЗрддрд╛ - рдЬрдм рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдЙрдирдореЗрдВ рдмрд╣реБрдд рдХрдо рд╕рдордЭ рд╣реЛрддреА рд╣реИред

рдЕрдм рдФрд░ рджрд┐рд▓рдЪрд╕реНрдкред рд╣рдо SUBQ рд╕реЗ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдЯреНрдпреВрди рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдЖрдк рдЗрд╕реЗ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛ рдЖрдк рд╕рдмрдХреНрд╡реЗрд░реА рдХреЛ рд╕рдмрдХреНрд╡реЗрд░реА рдореЗрдВ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ - рдЗрд╕рдХрд╛ рдирддреАрдЬрд╛ рдирд╣реАрдВ рдмрджрд▓реЗрдЧрд╛ред рд╣рдо рд▓рд┐рдЦрддреЗ рд╣реИрдВ:

 declare @c int = 0 while @c < 5 begin SELECT * FROM ( SELECT ABS(CONVERT(INT, CONVERT(BINARY(4), NEWID()))) % 5 AS RNDIDX FROM ( SELECT 1 AS ID ) ROWSRC ) SUBQ INNER JOIN ( SELECT 0 AS VAL UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 ) NUM ON SUBQ.RNDIDX = NUM.VAL set @c = @c + 1 end 

рд╣рдо рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЗ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ - рдФрд░ рдзреАрд░реЗ-рдзреАрд░реЗ рдХреБрд░реНрд╕реА рдХреЗ рдиреАрдЪреЗ рдХреНрд░реЙрд▓ рдХрд░рддреЗ рд╣реИрдВ - рдкреНрд░рддреНрдпреЗрдХ рдкрд░рд┐рдгрд╛рдо рд╕реЗрдЯ рдореЗрдВ рд▓рд╛рдЗрдиреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдареАрдХ 1 рдирд╣реАрдВ рд╣реИред рдХрд╣реАрдВ рди рдХрд╣реАрдВ рдЦрд╛рд▓реА рд╣реИ (рдЗрд╕реЗ рдХрдо рд╕реЗ рдХрдо рдХрд┐рд╕реА рддрд░рд╣ рд╕рдордЭрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ - INNER JOIN рдиреЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд┐рдпрд╛ рдХреНрдпреЛрдВрдХрд┐ RNDID рдиреЗ рд╕реАрдорд╛ рдЫреЛрдбрд╝ рджреА рдереА [0]ред .4] (рдЬреЛ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд╣реИ!)), рд▓реЗрдХрд┐рди рдХрд╣реАрдВ - рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ (!) рд░рд┐рдХреЙрд░реНрдбред

рдЫрд╡рд┐

рдЕрдм рд╣рдо рдПрдХ рдирд┐рд░реНрджреЛрд╖ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рддреЗ рд╣реИрдВ - INNER рдХреЛ LEFT рдореЗрдВ рдмрджрд▓реЗрдВ:

 declare @c int = 0 while @c < 5 begin SELECT * FROM ( SELECT ABS(CONVERT(INT, CONVERT(BINARY(4), NEWID()))) % 5 AS RNDIDX FROM ( SELECT 1 AS ID ) ROWSRC ) SUBQ LEFT JOIN ( SELECT 0 AS VAL UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 ) NUM ON SUBQ.RNDIDX = NUM.VAL set @c = @c + 1 end 

рд╣рдо рдкреНрд░рджрд░реНрд╢рди рдХрд░рддреЗ рд╣реИрдВ - рд╕рдм рдХреБрдЫ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ (!) - рдЕрдкрдиреЗ рдЖрдк рдХреЛ рдЬрд╛рдВрдЪ рд▓реЗрдВ, рдореИрдВрдиреЗ рд╕рд╣реА рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдирд╣реАрдВ рд▓рд┐рдпрд╛ред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдХрд┐рд╕реА рднреА RNDIDX рдорд╛рди рдХреЗ рд▓рд┐рдП рд░реЗрдВрдЬ [0..4] рд╕реЗ рдЬреЛ рдХрд┐ SUBQ рд╕рдмрдХреНрд╡реЗрд░реА рдХреЛ рдЖрдЙрдЯрдкреБрдЯ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИ, NUM рд╕рдмрдХреНрд╡реЗрд░реА рд╕реЗ рд╣рдореЗрд╢рд╛ рд╡реИрд▓ рд╡реИрд▓реНрдпреВ рд╣реИ, рддрд░реНрдХ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ, LEFT рдФрд░ INNER JOIN рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╕рдорд╛рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ!

рдПрдХ рдФрд░ рдкрд░реАрдХреНрд╖рдг - рд╣рдо INNER рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ рдЙрдкрд╢реНрд░реЗрдгреА рдореЗрдВ TOP / ORDER BY рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред рдХреНрдпреЛрдВ - рдЙрд╕ рдкрд░ рдФрд░ рдмрд╛рдж рдореЗрдВ, рдЖрдЗрдП рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ:

 declare @c int = 0 while @c < 5 begin SELECT * FROM ( SELECT TOP 1 ABS(CONVERT(INT, CONVERT(BINARY(4), NEWID()))) % 5 AS RNDIDX FROM ( SELECT 1 AS ID ) ROWSRC ORDER BY RNDIDX ) SUBQ INNER JOIN ( SELECT 0 AS VAL UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 ) NUM ON SUBQ.RNDIDX = NUM.VAL set @c = @c + 1 end 

рд╕рдм рдХреБрдЫ рдлрд┐рд░ рд╕реЗ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ! рд░рд╣рд╕реНрдпрд╡рд╛рджреА!

Googling, рд╣рдореЗрдВ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рджреБрдирд┐рдпрд╛ рднрд░ рдХреЗ SQL рдбреЗрд╡рд▓рдкрд░реНрд╕ рд╕рдордп-рд╕рдордп рдкрд░ рдЗрд╕ рддрд░рд╣ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рддреЗ рд╣реИрдВ - рдпрд╣рд╛рдБ рдпрд╛ рдпрд╣рд╛рдБ рдЙрджрд╛рд╣рд░рдг

рд▓реЛрдЧ рд╕реБрдЭрд╛рд╡ рджреЗрддреЗ рд╣реИрдВ рдХрд┐ рдЙрдкрд╢рдорд┐рдХреАрдп рднреМрддрд┐рдХреАрдХрд░рдг рдорджрдж рдХрд░рддрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрджрд┐ рд╣рдо рдЙрджрд╛рд╣рд░рдг рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рддреЛ рдкрд╣рд▓реЗ рдЕрд╕реНрдерд╛рдпреА рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд░рд┐рдХреЙрд░реНрдб рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ, рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рд╣реА рдЗрд╕реЗ рд╕рдорд╛рдкреНрдд рдХрд░реЗрдВ, рд╕рдм рдХреБрдЫ рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдХреНрдпреЛрдВ LEFT рдХреЗ рд╕рд╛рде INNER рдХрд╛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдпрд╛ TOP / ORDER рдХрд╛ рдЬреЛрдбрд╝ рдЬрд╣рд╛рдВ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ? рдпрд╣ рд╕рдм рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ - рдПрдХ рдорд╛рдорд▓реЗ рдореЗрдВ рд╕рдмрдХреНрд╡реЗрд░реА рдкрд░рд┐рдгрд╛рдореЛрдВ рдХрд╛ рдПрдХ рднреМрддрд┐рдХрдХрд░рдг рд╣реИ, рджреВрд╕рд░реЗ рдореЗрдВ - рдирд╣реАрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддреГрдд рдорд╛рдорд▓реЗ рдХреА рдпреЛрдЬрдирд╛ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг, рдпрд╣ рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рдЕрдВрддрд░ рджрд┐рдЦрд╛ рд╕рдХрддрд╛ рд╣реИ:

 DECLARE @B TABLE (VAL INT) INSERT INTO @B VALUES (0), (1), (2), (3), (4) SELECT * FROM ( SELECT ABS(CONVERT(INT, CONVERT(BINARY(4), NEWID()))) % 5 AS RNDIDX FROM @B ) SUBQ INNER JOIN @BB ON SUBQ.RNDIDX = B.VAL  ,   (query 2),   @B    : 
рдЫрд╡рд┐

рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрд╡реЗрд░реА рдиреНрдпреВрдЖрдИрдбреА () рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХреЙрд▓рдо рдХреЗ рдореВрд▓реНрдп рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреА рджреЛ рдзрд╛рд░рд╛рдУрдВ рдХреЛ рдорд┐рд▓рд╛рддреА рд╣реИред рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ SQL рдЗрдВрдЬрди рдорд╛рдирддрд╛ рд╣реИ рдХрд┐ newID рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдпрд╛ рдЧрдпрд╛ рдорд╛рди (), рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЧреИрд░-рдирд┐рдпрддрд╛рддреНрдордХ рд╣реИ, рдкреВрд░реЗ рдмреИрдЪ рдореЗрдВ рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдорд╛рдорд▓рд╛ рдирд╣реАрдВ рд╣реИ - рдФрд░ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдЗрд╕рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЕрдм INNER рдХреЛ LEFT рдореЗрдВ рдмрджрд▓реЗрдВ, рдФрд░ рдпреЛрдЬрдирд╛ рджреЗрдЦреЗрдВ:

рдЫрд╡рд┐

рд╣рд╛рдБ, рдмрд╛рдПрдБ рдЬреНрд╡рд╛рдЗрдВрдЯ рдиреЗ SQL рдЗрдВрдЬрди рдХреЛ рдереНрд░реЗрдбреНрд╕ рдорд░реНрдЬ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХрдВрдкреНрдпреВрдЯ рд╕реНрдХреЗрд▓рд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд┐рдпрд╛, рдЗрд╕рд▓рд┐рдП рд╣рдорд╛рд░реА рдХреНрд╡реЗрд░реА рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджреАред

рдЕрдВрдд рдореЗрдВ, TOP / ORDER BY рдХреЗ рд╕рд╛рде рд╕рдВрд╕реНрдХрд░рдг рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВ:

рдЫрд╡рд┐

рджрд░рдЕрд╕рд▓, рдирд┐рджрд╛рди рд╕реНрдкрд╖реНрдЯ рд╣реИред рдПрдордПрд╕ SQL тАЛтАЛрдирдПрдЖрдИрдбреА () рдХреА рдЦрд╝рд╛рд╕рд┐рдпрдд рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рдирд╣реАрдВ рд░рдЦрддрд╛ рд╣реИ, рдФрд░ рддрджрдиреБрд╕рд╛рд░, рдпрд╣ рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ рдпреЛрдЬрдирд╛рдУрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдмреИрдЪ рдХреЗ рджрд╛рдпрд░реЗ рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдП рдЧрдП рдирд┐рд░рдВрддрд░ рдореВрд▓реНрдп рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рдЪрд╛рд░реЛрдВ рдУрд░ рдПрдХ рдХрд╛рдо рд╣реИ - рдирд┐рд░реНрднрд░ рдкреНрд░рд╢реНрдиреЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдЪрдпрди рдХреЛ рдЙрддреНрдкреНрд░реЗрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП SQL рдЗрдВрдЬрди рдХреЛ рдордЬрдмреВрд░ рдХрд░рдирд╛ред рдЖрдк рдХреИрд╕реЗ рдордЯреЗрд░рд┐рдпрд▓ рдХрд░реЗрдВрдЧреЗ, рдпрд╣ рдЖрдк рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЯреЗрдмрд▓ рд╡реЗрд░рд┐рдПрдмрд▓реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реИ, рдЦрд╛рд╕рдХрд░ рдЕрдЧрд░ рд╕рдмреНрд╕реНрдХреНрд░рд╛рдЗрдм рдХрд╛ рдЖрдХрд╛рд░ рдЫреЛрдЯрд╛ рд╣реИред рдЕрдиреНрдпрдерд╛, рдкрд░рд┐рдгрд╛рдо, рдЗрд╕реЗ рд╣рд▓реНрдХреЗ рдврдВрдЧ рд╕реЗ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, 100% рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рд╣реИ; рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕ рдмрд╛рдд рдХреА рдХреЛрдИ рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рд╣реИ рдХрд┐ рдПрдХ рджрд┐рди рдЖрдк рд╕реНрд╡рдпрдВ рдпрд╛ рдХреЛрдИ рдФрд░ тАЬрдЕрдирд╛рд╡рд╢реНрдпрдХтАЭ TOP / ORDER рджреНрд╡рд╛рд░рд╛ рдпрд╛ рдмреБрджреНрдзрд┐рдорд╛рдиреА рд╕реЗ LEFT рдХреЛ INNER рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдХреЗ рдХреЛрдб рдХреА рд╕рдореАрдХреНрд╖рд╛ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред

рджрд░рдЕрд╕рд▓, рдмрд╕ рдЗрддрдирд╛ рд╣реАред рдПрдХ рдЕрдЪреНрдЫреА SQL рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХрд░реЗрдВ!

Source: https://habr.com/ru/post/In177221/


All Articles