দয়া করে এই কোডটি দেখুন:
create table #t1(
id int identity (1,1),
val varchar(10)
);
insert into #t1 values ('a');
insert into #t1 values ('b');
insert into #t1 values ('c');
insert into #t1 values ('d');
এখন, আপনি যখনই এটি কার্যকর করবেন
select *,
( select top 1 val from #t1 order by NEWID()) rnd
from #t1 order by 1;
সমস্ত সারি একইরকম এলোমেলো মান আছে যেখানে আপনি একটি ফলাফল পাবেন। যেমন
id val rnd
----------- ---------- ----------
1 a b
2 b b
3 c b
4 d b
আমি একটি কার্সার ব্যবহার করে সারিগুলিকে ছুঁড়ে ফেলা এবং বিভিন্ন এলোমেলো মান পেতে একটি উপায় জানি, তবে এটি সম্পাদনযোগ্য নয়।
এটির একটি চতুর সমাধান
select t1.id, t1.val, t2.val
from #t1 t1
join (select *, ROW_NUMBER() over( order by NEWID()) lfd from #t1) as t2 on t1.id = t2.lfd
তবে আমি কোয়েরিটি সরল করে দিয়েছি। আসল ক্যোয়ারী আরও ভাল দেখাচ্ছে
select *,
( select top 1 val from t2 where t2.x <> t1.y order by NEWID()) rnd
from t1 order by 1;
এবং সহজ সমাধান ফিট করে না। আমি বারবার মূল্যায়ন জোর করার জন্য একটি উপায় খুঁজছি
( select top 1 val from #t1 order by NEWID()) rnd
কার্সার ব্যবহার ছাড়াই।
সম্পাদনা: আকাঙ্ক্ষিত আউটপুট:
সম্ভবত 1 কল
id val rnd
----------- ---------- ----------
1 a c
2 b c
3 c b
4 d a
এবং একটি দ্বিতীয় কল
id val rnd
----------- ---------- ----------
1 a a
2 b d
3 c d
4 d b
প্রতিটি সারিটির মান অন্য সারি থেকে স্বতন্ত্র এলোমেলো মান হওয়া উচিত
কোডটির কার্সার সংস্করণটি এখানে:
CREATE TABLE #res ( id INT, val VARCHAR(10), rnd VARCHAR(10));
DECLARE @id INT
DECLARE @val VARCHAR(10)
DECLARE c CURSOR FOR
SELECT id, val
FROM #t1
OPEN c
FETCH NEXT FROM c INTO @id, @val
WHILE @@FETCH_STATUS = 0
BEGIN
INSERT INTO #res
SELECT @id, @val, ( SELECT TOP 1 val FROM #t1 ORDER BY NEWID()) rnd
FETCH NEXT FROM c INTO @id, @val
END
CLOSE c
DEALLOCATE c
SELECT * FROM #res