বাস্তব জীবনের উদাহরণ, এসকিউএল-এ কখন আউটর / ক্রস প্রয়োগ করবেন


124

আমি CROSS / OUTER APPLYএকজন সহকর্মীর সাথে সন্ধান করছি এবং আমরা তাদের কোথায় ব্যবহার করব তার বাস্তব জীবনের উদাহরণ খুঁজে পেতে লড়াই করছি।

আমি অভ্যন্তরীণ যোগদানের জন্য ক্রস প্রয়োগ কখন ব্যবহার করব তা দেখার জন্য আমি অনেক সময় ব্যয় করেছি ? এবং গুগলিং তবে প্রধান (একমাত্র) উদাহরণটি দেখতে বেশ উদ্ভট বলে মনে হচ্ছে (অন্য টেবিল থেকে কত সারি নির্বাচন করতে হবে তা নির্ধারণের জন্য একটি টেবিল থেকে সারি গণনা ব্যবহার করে)।

আমি ভেবেছিলাম যে এই দৃশ্যটি থেকে উপকৃত হতে পারে OUTER APPLY:

পরিচিতি সারণী (প্রতিটি পরিচিতির জন্য 1 টি রেকর্ড ধারণ করে) যোগাযোগ প্রবেশ সারণী (প্রতিটি যোগাযোগের জন্য এন ফোন, ফ্যাক্স, ইমেল থাকতে পারে)

তবে সাবকিউরিগুলি, সাধারণ টেবিল এক্সপ্রেশনগুলি OUTER JOINসহ RANK()এবং সমস্তগুলি OUTER APPLYসমানভাবে সম্পাদন করে বলে মনে হয়। আমি অনুমান করছি এর অর্থ দৃশ্যটি প্রযোজ্য নয় APPLY

কিছু বাস্তব জীবনের উদাহরণ ভাগ করুন এবং বৈশিষ্ট্যটি ব্যাখ্যা করতে সহায়তা করুন!


5
"প্রতি গ্রুপের উপরে এন" বা এক্সএমএল পার্স করা সাধারণ। আমার উত্তর কিছু দেখতে stackoverflow.com/...
gbn




এছাড়াও এখানে চেক করুন stackoverflow.com/questions/27838045/where-to-use-outer-apply
সারাথ Avanavu

উত্তর:


174

এর জন্য কয়েকটি ব্যবহার APPLYরয়েছে ...

1) গ্রুপ কোয়েরিতে শীর্ষ এন (কিছু কার্ডিনালিটির জন্য আরও কার্যকর হতে পারে)

SELECT pr.name,
       pa.name
FROM   sys.procedures pr
       OUTER APPLY (SELECT TOP 2 *
                    FROM   sys.parameters pa
                    WHERE  pa.object_id = pr.object_id
                    ORDER  BY pr.name) pa
ORDER  BY pr.name,
          pa.name 

2) বাইরের ক্যোয়ারিতে প্রতিটি সারির জন্য একটি সারণী মূল্যবান ফাংশন কল করা

SELECT *
FROM sys.dm_exec_query_stats AS qs
CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle)

3) একটি কলামের ওরফে পুনরায় ব্যবহার করা

SELECT number,
       doubled_number,
       doubled_number_plus_one
FROM master..spt_values
CROSS APPLY (SELECT 2 * CAST(number AS BIGINT)) CA1(doubled_number)  
CROSS APPLY (SELECT doubled_number + 1) CA2(doubled_number_plus_one)  

৪) একাধিক কলামের গ্রুপকে অপিভোট করা

ধরে নেওয়া 1NF টেবিল কাঠামো লঙ্ঘন ....

CREATE TABLE T
  (
     Id   INT PRIMARY KEY,

     Foo1 INT, Foo2 INT, Foo3 INT,
     Bar1 INT, Bar2 INT, Bar3 INT
  ); 

উদাহরণস্বরূপ ২০০++ VALUESসিনট্যাক্স ব্যবহার করে ।

SELECT Id,
       Foo,
       Bar
FROM   T
       CROSS APPLY (VALUES(Foo1, Bar1),
                          (Foo2, Bar2),
                          (Foo3, Bar3)) V(Foo, Bar); 

2005 সালে UNION ALLপরিবর্তে ব্যবহার করা যেতে পারে।

SELECT Id,
       Foo,
       Bar
FROM   T
       CROSS APPLY (SELECT Foo1, Bar1 
                    UNION ALL
                    SELECT Foo2, Bar2 
                    UNION ALL
                    SELECT Foo3, Bar3) V(Foo, Bar);

1
সেখানে ব্যবহারের একটি দুর্দান্ত তালিকা তবে কীটি হ'ল বাস্তব জীবনের উদাহরণ examples আমি প্রতিটিটির জন্য একটি দেখতে পছন্দ করব।
লি টিকিট

# 1 এর জন্য এটি র‌্যাঙ্ক, সাবকোয়ারি বা সাধারণ টেবিলের মত প্রকাশের সাথে সমানভাবে অর্জন করা যায়? এটি সত্য না হলে আপনি উদাহরণ সরবরাহ করতে পারেন?
লি টিকিট

@ লিটিকিকেট - লিঙ্কটি পড়ুন দয়া করে। আপনি কখন একে অপরকে পছন্দ করবেন সে সম্পর্কে এটিতে 4 পৃষ্ঠার আলোচনা রয়েছে।
মার্টিন স্মিথ

1
উদাহরণস্বরূপ # 1 অন্তর্ভুক্ত লিঙ্কটি পরিদর্শন করার বিষয়টি নিশ্চিত করুন। আমি উভয় বিভিন্ন দৃশ্যে ভাল পারফরম্যান্স সহ এই দুটি পদ্ধতির (রোভার ওভার ক্রস এবং ক্রস প্রয়োগ) ব্যবহার করেছি, তবে কেন তারা আলাদাভাবে সম্পাদন করে তা আমি কখনই বুঝতে পারি না। সেই নিবন্ধটি স্বর্গ থেকে প্রেরণ করা হয়েছিল !! দিকনির্দেশ অনুসারে অর্ডার মেলাতে যথাযথ সূচিকরণের উপর ফোকাসটি "যথাযথ" কাঠামো রয়েছে এমন প্রশ্নের জন্য জিজ্ঞাসা করার ক্ষেত্রে কার্যকারিতা সম্পর্কিত সমস্যাগুলির পক্ষে একটি বড় উপায়ে সহায়তা করেছে। এটি অন্তর্ভুক্ত করার জন্য আপনাকে ধন্যবাদ !!
ক্রিস পোর্টার

1
@ এমআর_এক্লেয়ার দেখে মনে হচ্ছে এটি এখন এটি প্রোটোডেএই
মার্টিন স্মিথ

87

বিভিন্ন পরিস্থিতি রয়েছে যেখানে আপনি এড়াতে পারবেন না CROSS APPLYবা এড়াতে পারবেন না OUTER APPLY

আপনার দুটি টেবিল রয়েছে তা বিবেচনা করুন।

মাস্টার সারণী

x------x--------------------x
| Id   |        Name        |
x------x--------------------x
|  1   |          A         |
|  2   |          B         |
|  3   |          C         |
x------x--------------------x

বিশদ টেবিল

x------x--------------------x-------x
| Id   |      PERIOD        |   QTY |
x------x--------------------x-------x
|  1   |   2014-01-13       |   10  |
|  1   |   2014-01-11       |   15  |
|  1   |   2014-01-12       |   20  |
|  2   |   2014-01-06       |   30  |
|  2   |   2014-01-08       |   40  |
x------x--------------------x-------x                                       



                                                            আবেদন করুন

অনেক অবস্থা যেখানে আমরা প্রতিস্থাপন করা প্রয়োজন আছে INNER JOINসঙ্গে CROSS APPLY

1. যদি আমরা কার্যকারিতা TOP nসহ ফলাফলগুলিতে 2 টেবিলগুলিতে যোগদান করতে চাইINNER JOIN

যদি আমরা নির্বাচন করতে হবে বিবেচনা করুন Idএবং Nameথেকে Masterপ্রত্যেকের জন্য এবং শেষ দুটি তারিখের Idথেকে Details table

SELECT M.ID,M.NAME,D.PERIOD,D.QTY
FROM MASTER M
INNER JOIN
(
    SELECT TOP 2 ID, PERIOD,QTY 
    FROM DETAILS D      
    ORDER BY CAST(PERIOD AS DATE)DESC
)D
ON M.ID=D.ID

উপরের প্রশ্নটি নিম্নলিখিত ফলাফল উত্পন্ন করে।

x------x---------x--------------x-------x
|  Id  |   Name  |   PERIOD     |  QTY  |
x------x---------x--------------x-------x
|   1  |   A     | 2014-01-13   |  10   |
|   1  |   A     | 2014-01-12   |  20   |
x------x---------x--------------x-------x

দেখুন, এটি শেষ দুটি তারিখের সাথে শেষ দুটি তারিখের ফলাফল তৈরি করেছে Idএবং তারপরে কেবলমাত্র বাইরের ক্যোয়ারিতে এই রেকর্ডগুলিতে যোগদান করেছে Id, যা ভুল। এটি সম্পাদন করার জন্য, আমাদের ব্যবহার করা দরকার CROSS APPLY

SELECT M.ID,M.NAME,D.PERIOD,D.QTY
FROM MASTER M
CROSS APPLY
(
    SELECT TOP 2 ID, PERIOD,QTY 
    FROM DETAILS D  
    WHERE M.ID=D.ID
    ORDER BY CAST(PERIOD AS DATE)DESC
)D

এবং ফর্ম তিনি অনুসরণ নিম্নলিখিত।

x------x---------x--------------x-------x
|  Id  |   Name  |   PERIOD     |  QTY  |
x------x---------x--------------x-------x
|   1  |   A     | 2014-01-13   |  10   |
|   1  |   A     | 2014-01-12   |  20   |
|   2  |   B     | 2014-01-08   |  40   |
|   2  |   B     | 2014-01-06   |  30   |
x------x---------x--------------x-------x

এখানে কাজ করা হয়। কোয়েরির ভিতরে CROSS APPLYথাকা সন্ধানটি বাইরের সারণিকে উল্লেখ করতে পারে, যেখানে এটি INNER JOINকরতে পারে না (কম্পাইল ত্রুটি নিক্ষেপ করে)। শেষ দুটি তারিখ সন্ধান করার সময়, যোগদান করা ভিতরে করা হয়, CROSS APPLYঅর্থাৎ WHERE M.ID=D.ID

2. যখন আমাদের INNER JOINফাংশনগুলি ব্যবহার করে কার্যকারিতা প্রয়োজন ।

CROSS APPLYINNER JOINযখন আমাদের Masterটেবিল থেকে ফলাফল পেতে হবে এবং ক এর সাথে প্রতিস্থাপন হিসাবে ব্যবহার করা যেতে পারে function

SELECT M.ID,M.NAME,C.PERIOD,C.QTY
FROM MASTER M
CROSS APPLY dbo.FnGetQty(M.ID) C

এবং এখানে ফাংশন

CREATE FUNCTION FnGetQty 
(   
    @Id INT 
)
RETURNS TABLE 
AS
RETURN 
(
    SELECT ID,PERIOD,QTY 
    FROM DETAILS
    WHERE ID=@Id
)

যা নিম্নলিখিত ফলাফল উত্পন্ন

x------x---------x--------------x-------x
|  Id  |   Name  |   PERIOD     |  QTY  |
x------x---------x--------------x-------x
|   1  |   A     | 2014-01-13   |  10   |
|   1  |   A     | 2014-01-11   |  15   |
|   1  |   A     | 2014-01-12   |  20   |
|   2  |   B     | 2014-01-06   |  30   |
|   2  |   B     | 2014-01-08   |  40   |
x------x---------x--------------x-------x



                                                            আউট আবেদন করুন

1. যদি আমরা কার্যকারিতা TOP nসহ ফলাফলগুলিতে 2 টেবিলগুলিতে যোগদান করতে চাইLEFT JOIN

আমাদের যদি টেবিল Masterথেকে প্রতিটি আইডির জন্য আইডি এবং নাম এবং শেষ দুটি তারিখ নির্বাচন করতে হয় তা বিবেচনা করুন Details

SELECT M.ID,M.NAME,D.PERIOD,D.QTY
FROM MASTER M
LEFT JOIN
(
    SELECT TOP 2 ID, PERIOD,QTY 
    FROM DETAILS D  
    ORDER BY CAST(PERIOD AS DATE)DESC
)D
ON M.ID=D.ID

যা নিম্নলিখিত ফলাফল গঠন করে

x------x---------x--------------x-------x
|  Id  |   Name  |   PERIOD     |  QTY  |
x------x---------x--------------x-------x
|   1  |   A     | 2014-01-13   |  10   |
|   1  |   A     | 2014-01-12   |  20   |
|   2  |   B     |   NULL       |  NULL |
|   3  |   C     |   NULL       |  NULL |
x------x---------x--------------x-------x

এটি ভুল ফলাফল আনবে অর্থাত্, এটি আমাদের সাথে যোগদান করেও Detailsনির্বিশেষে টেবিল থেকে কেবল সর্বশেষ দুটি তারিখের ডেটা নিয়ে আসবে । সুতরাং সঠিক সমাধান ব্যবহার করা হয় ।IdIdOUTER APPLY

SELECT M.ID,M.NAME,D.PERIOD,D.QTY
FROM MASTER M
OUTER APPLY
(
    SELECT TOP 2 ID, PERIOD,QTY 
    FROM DETAILS D  
    WHERE M.ID=D.ID
    ORDER BY CAST(PERIOD AS DATE)DESC
)D

যা নিম্নলিখিত পছন্দসই ফলাফল গঠন করে

x------x---------x--------------x-------x
|  Id  |   Name  |   PERIOD     |  QTY  |
x------x---------x--------------x-------x
|   1  |   A     | 2014-01-13   |  10   |
|   1  |   A     | 2014-01-12   |  20   |
|   2  |   B     | 2014-01-08   |  40   |
|   2  |   B     | 2014-01-06   |  30   |
|   3  |   C     |   NULL       |  NULL |
x------x---------x--------------x-------x

২. যখন আমাদের LEFT JOINব্যবহারের কার্যকারিতা প্রয়োজন functions

OUTER APPLYLEFT JOINযখন আমাদের Masterটেবিল থেকে ফলাফল পেতে হবে এবং ক এর সাথে প্রতিস্থাপন হিসাবে ব্যবহার করা যেতে পারে function

SELECT M.ID,M.NAME,C.PERIOD,C.QTY
FROM MASTER M
OUTER APPLY dbo.FnGetQty(M.ID) C

এবং ফাংশন এখানে যায়।

CREATE FUNCTION FnGetQty 
(   
    @Id INT 
)
RETURNS TABLE 
AS
RETURN 
(
    SELECT ID,PERIOD,QTY 
    FROM DETAILS
    WHERE ID=@Id
)

যা নিম্নলিখিত ফলাফল উত্পন্ন

x------x---------x--------------x-------x
|  Id  |   Name  |   PERIOD     |  QTY  |
x------x---------x--------------x-------x
|   1  |   A     | 2014-01-13   |  10   |
|   1  |   A     | 2014-01-11   |  15   |
|   1  |   A     | 2014-01-12   |  20   |
|   2  |   B     | 2014-01-06   |  30   |
|   2  |   B     | 2014-01-08   |  40   |
|   3  |   C     |   NULL       |  NULL |
x------x---------x--------------x-------x



                             সাধারণ বৈশিষ্ট্য CROSS APPLYএবংOUTER APPLY

CROSS APPLYবা আনপিবোটিংয়ের সময় মানগুলি OUTER APPLYধরে রাখতে ব্যবহার করা যেতে পারে NULLযা বিনিময়যোগ্য।

নীচের টেবিলটি বিবেচনা করুন

x------x-------------x--------------x
|  Id  |   FROMDATE  |   TODATE     |
x------x-------------x--------------x
|   1  |  2014-01-11 | 2014-01-13   | 
|   1  |  2014-02-23 | 2014-02-27   | 
|   2  |  2014-05-06 | 2014-05-30   |    
|   3  |   NULL      |   NULL       | 
x------x-------------x--------------x

আপনি যখন একটি কলামে AND UNPIVOTআনতে ব্যবহার করবেন , এটি ডিফল্টরূপে মানগুলি মুছে ফেলবে ।FROMDATETODATENULL

SELECT ID,DATES
FROM MYTABLE
UNPIVOT (DATES FOR COLS IN (FROMDATE,TODATE)) P

যা নীচের ফলাফল তৈরি করে। নোট করুন যে আমরা Idসংখ্যার রেকর্ড মিস করেছি3

  x------x-------------x
  | Id   |    DATES    |
  x------x-------------x
  |  1   |  2014-01-11 |
  |  1   |  2014-01-13 |
  |  1   |  2014-02-23 |
  |  1   |  2014-02-27 |
  |  2   |  2014-05-06 |
  |  2   |  2014-05-30 |
  x------x-------------x

এই ক্ষেত্রে একটি CROSS APPLYবা OUTER APPLYদরকারী হবে

SELECT DISTINCT ID,DATES
FROM MYTABLE 
OUTER APPLY(VALUES (FROMDATE),(TODATE))
COLUMNNAMES(DATES)

যা নিম্নলিখিত ফলাফল গঠন করে এবং Idএর মান কোথায় রয়েছে তা ধরে রাখে3

  x------x-------------x
  | Id   |    DATES    |
  x------x-------------x
  |  1   |  2014-01-11 |
  |  1   |  2014-01-13 |
  |  1   |  2014-02-23 |
  |  1   |  2014-02-27 |
  |  2   |  2014-05-06 |
  |  2   |  2014-05-30 |
  |  3   |     NULL    |
  x------x-------------x

দুটি প্রশ্নের ঠিক একই উত্তর পোস্ট করার পরিবর্তে, কেন একটিকে সদৃশ হিসাবে পতাকাঙ্কিত করবেন না?
ট্যাব আললেমান

2
আমি এই উত্তরটি মূল প্রশ্নের উত্তর দেওয়ার ক্ষেত্রে আরও প্রযোজ্য বলে মনে করি। এর উদাহরণগুলি 'রিয়েল-লাইফ' ​​পরিস্থিতি দেখায়।
ফ্র্যাঙ্কো

সুতরাং স্পষ্ট করা। "শীর্ষ এন" দর্শন; বাম / অভ্যন্তরীণ যোগদানের সাথে কি "আইডির মাধ্যমে পার্টিশন ওভার পার্বত্য_" ব্যবহার করে এবং তারপরে "WHERE M.RowNumber <3" বা এর মতো কিছু নির্বাচন করা যায়?
চৈতন্য

1
সামগ্রিকভাবে দুর্দান্ত উত্তর! নিশ্চিতরূপে এটি গৃহীত জবাবদিদের চেয়ে উত্তম উত্তর, কারণ এটি হ'ল সহজ, সহজেই দৃশ্যমান উদাহরণ এবং ব্যাখ্যা সহ।
আর্সেন খাচাতুরিয়ান

8

জীবনের বাস্তব উদাহরণ হ'ল যদি আপনার কোনও শিডিয়ুলার থাকে এবং প্রতিটি নির্ধারিত কাজের জন্য সর্বাধিক সাম্প্রতিক লগ এন্ট্রিটি কী তা দেখতে চান।

select t.taskName, lg.logResult, lg.lastUpdateDate
from task t
cross apply (select top 1 taskID, logResult, lastUpdateDate
             from taskLog l
             where l.taskID = t.taskID
             order by lastUpdateDate desc) lg

আমাদের পরীক্ষাগুলিতে আমরা উইন্ডো ফাংশনটিতে সর্বদা শীর্ষ এন এর জন্য সর্বাধিক দক্ষ হয়ে উঠতে দেখি (আমি ভেবেছিলাম এটি প্রয়োগ হিসাবে সর্বদা সত্য হবে এবং সাবকোয়ারি উভয়ই অভিশাপযুক্ত / নেস্টেড লুপগুলির প্রয়োজন)। যদিও আমি মনে করি আমি সম্ভবত এটি ক্র্যাক করে ফেলেছি ... মার্টিনের লিঙ্ককে ধন্যবাদ জানায় যা আপনি পুরো টেবিলটি ফিরিয়ে দিচ্ছেন না এবং টেবিলে অনুকূল সূচকগুলি না থাকলে ক্রস প্রয়োগ (বা প্রয়োগের সাহায্যে পাঠকের সংখ্যা আরও কম হবে) একটি subquery যদি শীর্ষ এন যেখানে এন = 1)
লি টিকেট

আমি মূলত এই ক্যোয়ারীটি ঠিক এখানে পেয়েছি এবং এটি অবশ্যই নেস্টেড লুপগুলির সাথে কোনও উপশম সম্পাদন করছে না। প্রদত্ত লগ টেবিলটিতে টাস্কআইডি এবং সর্বশেষ আপডেটের পিকে রয়েছে, এটি একটি খুব দ্রুত অপারেশন। উইন্ডো ফাংশনটি ব্যবহার করার জন্য আপনি কীভাবে এই ক্যোয়ারীটি সংস্কার করবেন?
বিজুরি

2
টাস্ক টির অভ্যন্তরীণ যোগদান থেকে * নির্বাচন করুন (টাস্কিড, লগ্রেসাল্ট, লাস্টআপডেটেটেট, র‌্যাঙ্ক () ওভার (টাস্কিড অর্ডার দিয়ে পার্টিশন লাস্টআপডেটেট ডেস্ক) _রেঙ্ক) এলজি উপর lg.taskid = t.taskid এবং lg._rank = 1
লি টিকিট

5

উপরের পয়েন্টটির জবাব দেওয়ার জন্য একটি উদাহরণ ছিটকুন:

create table #task (taskID int identity primary key not null, taskName varchar(50) not null)
create table #log (taskID int not null, reportDate datetime not null, result varchar(50) not null, primary key(reportDate, taskId))

insert #task select 'Task 1'
insert #task select 'Task 2'
insert #task select 'Task 3'
insert #task select 'Task 4'
insert #task select 'Task 5'
insert #task select 'Task 6'

insert  #log
select  taskID, 39951 + number, 'Result text...'
from    #task
        cross join (
            select top 1000 row_number() over (order by a.id) as number from syscolumns a cross join syscolumns b cross join syscolumns c) n

এবং এখন দুটি কার্যকর করতে একটি কার্যকর পরিকল্পনা নিয়ে অনুসন্ধান করুন।

select  t.taskID, t.taskName, lg.reportDate, lg.result
from    #task t
        left join (select taskID, reportDate, result, rank() over (partition by taskID order by reportDate desc) rnk from #log) lg
            on lg.taskID = t.taskID and lg.rnk = 1

select  t.taskID, t.taskName, lg.reportDate, lg.result
from    #task t
        outer apply (   select  top 1 l.*
                        from    #log l
                        where   l.taskID = t.taskID
                        order   by reportDate desc) lg

আপনি দেখতে পাচ্ছেন যে বাইরের প্রয়োগের ক্যোয়ারী আরও দক্ষ। (আমি একজন নতুন ব্যবহারকারী হিসাবে ... পরিকল্পনাটি সংযুক্ত করতে পারেনি ... দোহ))


এক্সিকিউশন প্ল্যানটি আমার আগ্রহী - আপনি কি জানেন যে র‌্যাঙ্ক () সমাধান কেন কোনও সূচক স্ক্যান করে এবং বহিরাগত প্রয়োগের বিপরীতে ব্যয়বহুল বাছাই করে যা সূচকগুলি সন্ধান করে এবং কোনও সাজানোর জন্য উপস্থিত হয় না (যদিও এটি অবশ্যই কারণ আপনি করতে পারেন ' বাছাই ছাড়াই শীর্ষে কাজ করবেন?)
লি টিকিট

1
বাইরের প্রয়োগের জন্য বাছাই করার দরকার নেই, কারণ এটি অন্তর্নিহিত টেবিলের সূচকটি ব্যবহার করতে পারে। সম্ভবত র‌্যাঙ্ক () ফাংশন সহ ক্যোয়ারির র‌্যাঙ্কিংটি সঠিক কিনা তা নিশ্চিত করতে পুরো টেবিলটি প্রক্রিয়া করা প্রয়োজন।
বিজুরি

আপনি বাছাই ছাড়া একটি শীর্ষ করতে পারবেন না। যদিও পুরো টেবিলটি প্রক্রিয়াকরণ করার বিষয়ে আপনার বক্তব্য সত্য হতে হবে তা অবাক করে দিতে হবে (আমি জানি এসকিএল অপ্টিমাইজার / সংকলক সময়ে সময়ে হতাশ হতে পারে তবে এটি পাগল আচরণ হবে)
লি টিকিট

2
আপনার গ্রুপিং ডেটা যখন কোনও সূচকের বিপরীতে থাকে তখন আপনি কোনও শীর্ষ ছাড়াই শীর্ষস্থানীয় করতে পারেন, কারণ আশাবাদী জানেন যে এটি ইতিমধ্যে সাজানো হয়েছে তাই আক্ষরিকভাবে সূচি থেকে প্রথম (বা শেষ) প্রবেশ বন্ধ করতে হবে।
বিজুরি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.