এসকিউএল বামে FROM লাইনে একাধিক টেবিল বনাম যোগদান করবেন?


256

বেশিরভাগ এসকিউএল উপভাষাগুলি নিম্নলিখিত উভয় প্রশ্নের গ্রহণ করে:

SELECT a.foo, b.foo
FROM a, b
WHERE a.x = b.x

SELECT a.foo, b.foo
FROM a
LEFT JOIN b ON a.x = b.x

এখন স্পষ্টতই যখন আপনার বাহ্যিক যোগদানের দরকার হয় তখন দ্বিতীয় বাক্য গঠনটি প্রয়োজন। তবে অভ্যন্তরীণ যোগদানের সময় কেন আমি দ্বিতীয় সিনট্যাক্সটিকে প্রথম (বা বিপরীতে) পছন্দ করব?


1
গুফা: আপনি এটি কিভাবে পেলেন? যদিও আমার প্রশ্নটি "আমি কীভাবে করব" তার চেয়ে বেশি ভাল অনুশীলন
jmucchiello

যেহেতু এটি সর্বোত্তম অনুশীলন তাই দয়া করে এটি একটি উইকি করুন।
বিনোজ অ্যান্টনি

1
আমি মনে করি না যে এই দুজনের অভিনয় সম্পর্কে কেউ মন্তব্য করেছিলেন। যে কেউ উল্লেখযোগ্য পার্থক্য সম্পর্কে যুক্তিসঙ্গত কিছু নিশ্চিত বা উদ্ধৃত করতে পারে?
আহ্নবিজক্যাড

@ahnbizcad প্রদত্ত দুটি ক্যোয়ারি একই কাজ করে না। প্রথমটি অন্তর্ভুক্ত হওয়া হিসাবে একই হিসাবে ফেরত দেয়। বাস্তবায়নটি ডিবিএমএস সংস্করণ-নির্দিষ্ট এবং এরপরেও কয়েকটি গ্যারান্টি রয়েছে। তবে ডিবিএমএস রূপান্তরগুলি কমা বনাম অন্তর্নির্মিত মামলার তুলনায় কম / জনের তুলনায় ক্রস যোগ যেখানে নগণ্য। রিলেশনাল ডাটাবেস ক্যোয়ারী অপ্টিমাইজেশন / বাস্তবায়ন সম্পর্কে জানুন।
ফিলিপ্সি

একটি সংস্থার সুপারিশ পেয়েছি? আমি এখানে থেকে শেখার চেষ্টা করি কেননা বিশাল, ঘন ম্যানুয়ালগুলি।
আহ্নবিজক্যাড

উত্তর:


319

সবেমাত্র সারণী তালিকাবদ্ধ করার WHEREসাথে এবং যোগদানের মানদণ্ড নির্দিষ্ট করার জন্য ক্লজটি ব্যবহার করে পুরানো বাক্য গঠনটি বেশিরভাগ আধুনিক ডাটাবেসে অবচয় করা হচ্ছে।

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

আমাকে যদি আপনি একটি উদাহরণ দিতে।

ধরা যাক আপনার সিস্টেমে আপনার কাছে 3 টি টেবিল রয়েছে:

Company
Department
Employee

প্রতিটি টেবিলে একসাথে লিঙ্কযুক্ত অসংখ্য সারি থাকে। আপনি একাধিক সংস্থা পেয়েছেন এবং প্রতিটি সংস্থার একাধিক বিভাগ থাকতে পারে এবং প্রতিটি বিভাগে একাধিক কর্মচারী থাকতে পারে।

ঠিক আছে, সুতরাং এখন আপনি নিম্নলিখিতটি করতে চান:

সমস্ত সংস্থাকে তালিকাবদ্ধ করুন এবং তাদের সমস্ত বিভাগ এবং তাদের সমস্ত কর্মচারী অন্তর্ভুক্ত করুন। মনে রাখবেন যে কয়েকটি সংস্থার এখনও কোনও বিভাগ নেই তবে আপনি সেগুলিও অন্তর্ভুক্ত করেছেন তা নিশ্চিত করুন। নিশ্চিত হয়ে নিন যে আপনি কেবলমাত্র বিভাগগুলি পুনরুদ্ধার করেছেন যেখানে কর্মচারী রয়েছে তবে সর্বদা সমস্ত সংস্থার তালিকা তৈরি করুন।

সুতরাং আপনি এটি করুন:

SELECT * -- for simplicity
FROM Company, Department, Employee
WHERE Company.ID *= Department.CompanyID
  AND Department.ID = Employee.DepartmentID

নোট করুন যে আপনি কেবল লোকদের সাথে বিভাগগুলি চান সেই মানদণ্ডটি পূরণ করার জন্য শেষটি একটি অভ্যন্তরীণ যোগদান রয়েছে।

ঠিক আছে, তাই এখন কি হয়। ঠিক আছে, সমস্যাটি হ'ল এটি ডাটাবেস ইঞ্জিন, ক্যোরি অপটিমাইজার, সূচক এবং টেবিলের পরিসংখ্যানের উপর নির্ভর করে। আমাকে ব্যাখ্যা করতে দাও.

যদি ক্যোয়ারী অপ্টিমাইজারটি নির্ধারণ করে যে এটি করার উপায়টি প্রথমে কোনও সংস্থা নেওয়া, তারপরে বিভাগগুলি সন্ধান করুন এবং তারপরে কর্মীদের সাথে অভ্যন্তরীণ যোগদান করুন, আপনি এমন কোনও সংস্থা পাবেন না যার বিভাগ নেই।

এর কারণ হ'ল WHEREধারাটি নির্ধারণ করে যে কোন সারিগুলি চূড়ান্ত ফলাফলে শেষ হয়, সারিগুলির পৃথক অংশ নয়।

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

অন্যদিকে, যদি ক্যোয়ারী অপ্টিমাইজার বিভাগ-কর্মচারী যোগদানের বিষয়টি প্রথমে সামলানো এবং তারপরে সংস্থাগুলির সাথে বাম দিকে যোগদান করার সিদ্ধান্ত নেয়, আপনি সেগুলি দেখতে পাবেন।

সুতরাং পুরানো বাক্য বাক্যটি দ্ব্যর্থক। কোয়েরি ইঙ্গিতগুলি ব্যবহার না করে আপনি কী চান তা নির্দিষ্ট করার কোনও উপায় নেই এবং কিছু ডাটাবেসের কোনও উপায় নেই।

নতুন বাক্য গঠন লিখুন, এটির সাহায্যে আপনি চয়ন করতে পারেন।

উদাহরণস্বরূপ, যদি আপনি সমস্ত সংস্থাগুলি চান, যেমন সমস্যার বিবরণ বর্ণিত হয়েছে, আপনি যা লিখবেন তা এই:

SELECT *
FROM Company
     LEFT JOIN (
         Department INNER JOIN Employee ON Department.ID = Employee.DepartmentID
     ) ON Company.ID = Department.CompanyID

এখানে আপনি উল্লেখ করেছেন যে আপনি চান যে বিভাগ-কর্মচারী যোগদান হিসাবে একটি হিসাবে যোগদান করা হবে, এবং তারপরে সংস্থাগুলির সাথে এর ফলাফলগুলিতে যোগদান করুন।

অতিরিক্তভাবে, আসুন আমরা বলি যে আপনি কেবলমাত্র এমন বিভাগগুলি চান যা তাদের নামে X অক্ষর রাখে। আবার পুরানো স্টাইলের সাথে যোগ দেওয়ার সাথে সাথে আপনিও কোম্পানিকে হারাতে পারেন, যদি এটির নামে একটি এক্স সহ কোনও বিভাগ না থাকে তবে নতুন সিনট্যাক্সের সাহায্যে আপনি এটি করতে পারেন:

SELECT *
FROM Company
     LEFT JOIN (
         Department INNER JOIN Employee ON Department.ID = Employee.DepartmentID
     ) ON Company.ID = Department.CompanyID AND Department.Name LIKE '%X%'

এই অতিরিক্ত ধারাটি যোগদানের জন্য ব্যবহৃত হয়, তবে পুরো সারির জন্য ফিল্টার নয়। সুতরাং সারিটি সংস্থার তথ্য সহ উপস্থিত হতে পারে তবে সেই বিভাগের সমস্ত বিভাগ এবং কর্মচারী কলামগুলিতে NULL থাকতে পারে, কারণ সেই সংস্থার নামে একটি এক্স সহ কোনও বিভাগ নেই। এটি পুরানো বাক্য বাক্সের সাথে শক্ত।

এই কারণেই, অন্যান্য বিক্রেতাদের মধ্যে, মাইক্রোসফ্ট এসকিউএল সার্ভার ২০০৫ এবং তারপরের দিকে পুরানো বাইরের জোড় সিনট্যাক্সকে ছাড়েনি, তবে পুরানো অভ্যন্তরীণ জোড় সিনট্যাক্সকে ছাড়িয়েছে। মাইক্রোসফ্ট এসকিউএল সার্ভার ২০০ 2005 বা ২০০৮ সালে চলমান একটি ডাটাবেসের সাথে কথা বলার একমাত্র উপায়, পুরানো স্টাইলের বাইরের জোড় সিনট্যাক্স ব্যবহার করে, সেই ডাটাবেসটিকে 8.0 সামঞ্জস্যতা মোডে সেট করা (ওরফে এসকিউএল সার্ভার 2000)।

তদ্ব্যতীত, পুরানো উপায়, কোয়েরি অপ্টিমাইজারে টেবিলের একগুচ্ছ নিক্ষেপ করে WHERE ক্লজগুলির একগুচ্ছ, "এখানে আপনি আছেন, যথাসাধ্য চেষ্টা করুন" বলার অনুরূপ। নতুন সিনট্যাক্সের সাহায্যে, কোন্ অংশগুলি একসাথে চলেছে তা নির্ধারণের জন্য ক্যোয়ারী অপ্টিমাইজারের কাছে কম কাজ করা উচিত।

তাই সেখানে যদি আপনি এটি আছে।

বাম এবং অন্তর্ভুক্ত যোগদান ভবিষ্যতের তরঙ্গ।


28
"বেশিরভাগ আধুনিক ডাটাবেসে অবহেলা করা হচ্ছে।" --- শুধু কৌতূহলী, কোনটা?
zerkms

10
আমাকে ক্ষমা করুন, * = অপারেটরের সাথে পরিচিত নন, এটি কী করে? ধন্যবাদ!
আলট্রাওজন

9
রাশি = এবং = তারা (ভাল ছিলেন) ডান এবং বাম বাহিরের সাথে মিলিত হয়, বা এটি কি বাম এবং ডান? যুগ যুগ ধরে অবহেলিত হয়েছে, এসকিউএল সার্ভার 6 থেকে আমি সেগুলি ব্যবহার করি না
টনি হপকিনসন

3
কমা হ্রাস করা হয় না। কখনও-মানক OUTER JOINসিনট্যাক্স *=/ =*/ *=*অবমূল্যায়ন করা হয় না।
ফিলিপ্সি

1
এই উত্তর এমনকি প্রশ্নের উত্তর দেয় না, যা বাইরের সাথে যোগ দেয় না। কানাডা বনাম অন্তর্ভুক্ত হয়ে পুনরায় অপ্টিমাইজেশন সম্পর্কে যে দাবিটি করেছে তা ভুল।
ফিলিপ্সি

17

JOIN সিনট্যাক্স শর্তাদি তাদের প্রয়োগ করা টেবিলের কাছে রাখে। আপনি যখন প্রচুর পরিমাণে টেবিলগুলিতে যোগদান করেন এটি বিশেষত কার্যকর।

যাইহোক, আপনি প্রথম সিনট্যাক্সের সাথেও একটি বহিরাগত যোগদান করতে পারেন:

WHERE a.x = b.x(+)

অথবা

WHERE a.x *= b.x

অথবা

WHERE a.x = b.x or a.x not in (select x from b)

2
এমএস এসকিউএল সার্ভারে * = বাক্য গঠনটি হ্রাস করা হয়েছে এবং সঙ্গত কারণে: এটি কেবল পড়া কঠিন করে না, তবে লোকে যা মনে করে তা এটি করে না এবং এটি একইভাবে দেখা লেফট জয়েন্টের মতো নয়। (+) বাক্য গঠন আমার কাছে অপরিচিত; এসকিউএল বাস্তবায়ন কী করে?
ইউরো মিশেলি

2
অন্য বাক্য গঠনটি কমপক্ষে ওরাকল দ্বারা ব্যবহৃত হয়।
লাসে ভি কার্লসেন

4
এসকিউএল সার্ভার সিনট্যাক্স কখনই ব্যবহার করবেন না *, এটি ধারাবাহিক ফলাফল দেয় না কারণ এটি কখনও কখনও ক্রস জোড়কে বাম জোড়াকে নয় বলে ব্যাখ্যা করবে। এটি এসকিউএল সার্ভার 2000 এর মতোই সত্য। এটি ব্যবহার করে আপনার যদি কোনও কোড থাকে তবে আপনাকে ঠিক করতে হবে।
এইচএলজিইএম

12

প্রথম উপায়টি পুরানো মান। দ্বিতীয় পদ্ধতিটি এসকিউএল -২৯, http://en.wikedia.org/wiki/SQL এ চালু হয়েছিল । সম্পূর্ণ মানটি http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt এ দেখা যাবে ।

ডাটাবেস সংস্থাগুলি এসকিউএল -২২ স্ট্যান্ডার্ড গ্রহণ করার অনেক বছর সময় নিয়েছিল।

সুতরাং দ্বিতীয় পদ্ধতিটি কেন পছন্দ করা হয়, এটি এএনএসআই এবং আইএসও মান কমিটি অনুসারে এসকিউএল স্ট্যান্ডার্ড।


,এখনও মান। onকেবল outer joinএকবার সাবলেটর জন্য পরিচয় করানো হয়েছে জন্য পরিচয় করা প্রয়োজন।
ফিলিপ্সি

12

মূলত, যখন আপনার এফআরওএম ক্লজটি টেবিলগুলি তালিকাভুক্ত করে:

SELECT * FROM
  tableA, tableB, tableC

ফলস্বরূপ এ, বি, সি সারণীতে থাকা সমস্ত সারিগুলির একটি ক্রস প্রোডাক্ট এবং তারপরে আপনি এই বিধিনিষেধটি প্রয়োগ করেন WHERE tableA.id = tableB.a_idযা একটি বিশাল সংখ্যক সারি ফেলে দেবে, তারপরে আরও ... AND tableB.id = tableC.b_idএবং তারপরে আপনার কেবল সেই সারিগুলি পাওয়া উচিত যা আপনি সত্যই আগ্রহী ভিতরে.

ডিবিএমএসগুলি কীভাবে এই এসকিউএলটিকে অপ্টিমাইজ করতে হয় যাতে জিনগুলি ব্যবহার করে এটি লেখার পারফরম্যান্সের পার্থক্য নগণ্য (যদি থাকে)। জোইন স্বরলিপি ব্যবহার করে এসকিউএল স্টেটমেন্টটি আরও পঠনযোগ্য করে তোলে (আইএমএইচও, যোগ যোগ না দিয়ে বিবৃতিটি গোলমেলে পরিণত করে)। ক্রস পণ্যটি ব্যবহার করে, আপনার যেখানে বিধি-বিধানে যোগদানের মানদণ্ড সরবরাহ করতে হবে এবং স্বরলিপিটি সমস্যা। আপনি আপনার সামগ্রীর মতো স্টাফ দিয়ে ক্লাউড করছেন

    tableA.id = tableB.a_id 
AND tableB.id = tableC.b_id 

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


10

দ্বিতীয়টিকে অগ্রাধিকার দেওয়া হয়েছে কারণ এটি যেখানে ক্লজ শোধ করতে ভুলে গিয়ে দুর্ঘটনাকবলিত ক্রস যুক্ত হওয়ার সম্ভাবনা অনেক কম। অনুচ্ছেদে অনিচ্ছুক একটি যুক্ত সিনট্যাক্স চেককে ব্যর্থ করবে, একটি পুরানো শৈলীর সাথে যুক্ত হবে যেখানে ক্লজটি ব্যর্থ হবে না, এটি ক্রস জয়েন করবে।

অতিরিক্তভাবে যখন আপনাকে পরে বামে যোগ দিতে হয়, রক্ষণাবেক্ষণের জন্য এটি সহায়ক যে তারা সকলেই একই কাঠামোর মধ্যে রয়েছে। এবং পুরাতন বাক্য গঠনটি 1992 সাল থেকে পুরানো, এটি ব্যবহার বন্ধ করার জন্য এটি অতীত সময় is

এছাড়াও আমি দেখতে পেয়েছি যে অনেক লোক যারা প্রথম সিনট্যাক্সটি একচেটিয়াভাবে ব্যবহার করেন তারা সত্যিই যোগ দেয় এবং বুঝতে না পারার জন্য অনুসন্ধান করার সময় সঠিক ফলাফল পাওয়ার জন্য গুরুত্বপূর্ণ critical


6

আমি মনে করি এই পৃষ্ঠায় দ্বিতীয় পদ্ধতি ব্যবহার করে সুস্পষ্ট JOIN গ্রহণ করার কিছু ভাল কারণ রয়েছে। যদিও ক্লিঞ্জারটি হ'ল যখন জয়েন্ট মাপদণ্ডের বিধিটি সরিয়ে ফেলা হয় যেখানে বিধি থেকে বাকি বাছাইয়ের মানদণ্ডটি দেখার পক্ষে আরও সহজ হয়ে যায়।

সত্যিই জটিল নির্বাচনী জবানবন্দিতে পাঠকদের পক্ষে কী চলছে তা বোঝা অনেক সহজ হয়ে যায়।


5

SELECT * FROM table1, table2, ...সিনট্যাক্স টেবিল দুয়েক জন্য ঠিক আছে, কিন্তু এটা (ব্যাখ্যা মূলকভাবে হয়ে অগত্যা একটি গাণিতিকভাবে সঠিক বিবৃতি ) কঠিন এবং কঠিন টেবিল বৃদ্ধি নম্বর হিসাবে পড়তে।

JOIN সিনট্যাক্সটি লিখতে শক্ত (শুরুতে), তবে এটি কী স্পষ্ট করে তা কোন স্পষ্ট করে তা কোন টেবিলে প্রভাব ফেলে। এটি ভুল করা আরও শক্ত করে তোলে।

এছাড়াও, যদি সমস্ত যোগদানগুলি INNER হয় তবে উভয় সংস্করণ সমান। যাইহোক, আপনি যে মুহুর্তে কোনও বিবৃতিতে কোনও OUTER যোগদান করবেন, জিনিসগুলি আরও জটিল হয়ে উঠবে এবং এটি কার্যত গ্যারান্টিযুক্ত যে আপনি যা লিখবেন তা আপনাকে যা লিখেছেন তা জিজ্ঞাসাবাদ করবে না।


2

আপনার যখন বাহ্যিক যোগ প্রয়োজন তখন দ্বিতীয় বাক্য গঠনটি সর্বদা প্রয়োজন হয় না :

ওরাকল:

SELECT a.foo, b.foo
  FROM a, b
 WHERE a.x = b.x(+)

MSSQLServer (যদিও এটা করা হয়েছে অবচিত 2000 সংস্করণে) / সাইবেস:

SELECT a.foo, b.foo
  FROM a, b
 WHERE a.x *= b.x

কিন্তু আপনার প্রশ্নে ফিরে। আমি উত্তর জানি না, কিন্তু এটা সম্ভবত সত্য একটি যে সঙ্গে সম্পর্কযুক্ত যোগদানের একটি একটি অভিব্যক্তি যোগ করার চেয়ে আরও বেশি কিছু স্বাভাবিক (চিহ্নগুলি সিন্টেক্সের, অন্তত) যেখানে : দফা যখন আপনি ঠিক করছেন যোগদান


এসকিউএল সার্ভারটি বাম সংশ্লেষকে এমনকি অবধি এসকিউএল সার্ভার ২০০০ এ অবচয় রেখেছে এটি ধারাবাহিকভাবে সঠিক ফলাফল দেয় না (কখনও কখনও এটি একটি বাম জোড়ার পরিবর্তে ক্রস যোগ দেয়) এবং এসকিউএল সার্ভারে কখনও ব্যবহার করা উচিত নয়।
এইচএলজিএম

@ এইচএলজিইএম: তথ্যের জন্য ধন্যবাদ আপনি যা বলছেন তা প্রতিবিম্বিত করতে আমি আমার পোস্ট আপডেট করতে যাচ্ছি।
পাবলো সান্তা ক্রুজ

0

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


1
জিন সিনট্যাক্স ব্যবহার না করার এবং এটি প্রথম উপায়ে না করার অভ্যাসটি নিয়ে আমার বেড়ে ওঠা হয়েছিল। আমি অবশ্যই স্বীকার করতে পারি যে আমি এখনও প্রায়শই অভ্যাসের মধ্যে আটকে থাকি কারণ আমার মনে হয় যে আমার মস্তিষ্ক সেই যুক্তিটি অনুসরণ করতে শর্তযুক্ত হয়েছিল, আমার মাঝে মাঝে যুক্ত
সংশ্লেষটি

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

0

ডাটাবেসের কাছে, তারা একই রকম হয়। আপনার জন্য, যদিও, আপনাকে কিছু পরিস্থিতিতে সেই দ্বিতীয় বাক্য গঠনটি ব্যবহার করতে হবে। ক্যোয়ারী সম্পাদনা করার জন্য যেগুলি এটি ব্যবহার না করে শেষ করে (যেখানে আপনার সরল যোগদান ছিল সেখানে আপনার বাম জোড় দরকার ছিল তা সন্ধান করুন) এবং ধারাবাহিকতার জন্য, আমি কেবল ২ য় পদ্ধতিতে প্যাটার্ন করছি। এটি পড়াশোনাগুলি আরও সহজ করে তুলবে।


0

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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.