একই টেবিলে দু'বার যোগদানের সর্বোত্তম উপায় কী?


108

এটি কিছুটা জটিল, তবে আমার কাছে দুটি টেবিল রয়েছে। ধরা যাক কাঠামোটি এরকম কিছু:

*Table1*
ID
PhoneNumber1
PhoneNumber2

*Table2*
PhoneNumber
SomeOtherField

টেবিলগুলি টেবিল 1.ফোন নাম্বার 1 -> টেবিল 2.ফোন নম্বর, বা টেবিল 1.ফোন নাম্বার 2 -> টেবিল 2.ফোন নাম্বার এর ভিত্তিতে সারণিগুলি যুক্ত হতে পারে।

এখন, আমি একটি ফলসেট পেতে চাই যাতে ফোননম্বার 1, সামোনারফিল্ড যা ফোননম্বার 1, ফোননম্বার 2 এবং সামোনারফিল্ডের সাথে সামঞ্জস্যপূর্ণ যা ফোননম্বার 2 এর সাথে সম্পর্কিত।

আমি এটি করার 2 টি উপায় সম্পর্কে ভেবেছিলাম - হয় টেবিলে দু'বার যোগদান করে, অথবা একবার ওআর শৃঙ্খলে একবার যুক্ত হয়ে।

পদ্ধতি 1 :

SELECT t1.PhoneNumber1, t1.PhoneNumber2, 
   t2.SomeOtherFieldForPhone1, t3.someOtherFieldForPhone2
FROM Table1 t1
INNER JOIN Table2 t2
   ON t2.PhoneNumber = t1.PhoneNumber1
INNER JOIN Table2 t3
   ON t3.PhoneNumber = t1.PhoneNumber2

এটি কাজ করে বলে মনে হচ্ছে।

পদ্ধতি 2 :

একরকম দেখতে কিছুটা দেখতে এমন কোয়েরি থাকতে হবে -

SELECT ...
FROM Table1
INNER JOIN Table2 
   ON Table1.PhoneNumber1 = Table2.PhoneNumber OR
      Table1.PhoneNumber2 = Table2.PhoneNumber

আমি এখনও এটি কাজ করতে পেলাম না এবং এটি করার কোনও উপায় আছে কিনা তা আমি নিশ্চিত নই।

এটি সম্পাদন করার সর্বোত্তম উপায় কী? কোনও উপায়ই সহজ বা স্বজ্ঞাত বলে মনে হচ্ছে না ... এটি করার জন্য আরও সহজ সরল কোনও উপায় আছে কি? এই প্রয়োজনীয়তাটি সাধারণত কীভাবে প্রয়োগ করা হয়?

উত্তর:


151

প্রথমত, আমি চেষ্টা করব এবং প্রাকৃতিক কী হিসাবে ফোন নম্বরগুলি ব্যবহার করা থেকে দূরে থাকার জন্য এই টেবিলগুলিকে রিফ্যাক্টর করব। আমি প্রাকৃতিক কীগুলির অনুরাগী নই এবং এটির কারণ এটি একটি দুর্দান্ত উদাহরণ। প্রাকৃতিক কীগুলি, বিশেষত ফোন নম্বরগুলির মতো জিনিসগুলি পরিবর্তন হতে পারে এবং প্রায়শই তাই হতে পারে। পরিবর্তনটি ঘটে যখন আপনার ডাটাবেস আপডেট করা একটি বিশাল, ত্রুটি-ঝুঁকির মাথা ব্যাথা হবে। *

পদ্ধতি 1 আপনি বর্ণনা হিসাবে এটি আপনার সেরা বাজি যদিও। নামকরণের স্কিম এবং সংক্ষিপ্ত নামগুলির কারণে এটি কিছুটা পরিশ্রান্ত দেখাচ্ছে তবে ... একই টেবিলে একাধিকবার যোগদান বা সাবকিউরিস ইত্যাদি ব্যবহার করার সময় এলিয়াসিং আপনার বন্ধু is

আমি কিছুটা পরিষ্কার করে দিতাম:

SELECT t.PhoneNumber1, t.PhoneNumber2, 
   t1.SomeOtherFieldForPhone1, t2.someOtherFieldForPhone2
FROM Table1 t
JOIN Table2 t1 ON t1.PhoneNumber = t.PhoneNumber1
JOIN Table2 t2 ON t2.PhoneNumber = t.PhoneNumber2

আমি কি করেছিলাম:

  • INNER নির্দিষ্ট করার দরকার নেই - এটি আপনি Left বা RIGHT নির্দিষ্ট করে না তা এই দ্বারা বোঝানো হয়
  • আপনার প্রাথমিক দেখার টেবিলটিকে এন-প্রত্যয় দেবেন না
  • টেবিলের উপ-নামগুলি এন-প্রত্যয় যা এটি সুস্পষ্ট করতে আপনি একাধিকবার ব্যবহার করবেন

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


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

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

পারফেক্ট..কিন্তু এই পরিস্থিতিতে এলিয়াস কেন আবশ্যক?
রাইদেন কোর

একই টেবিলে দু'বার যোগদান না করে কী উপায় আছে? সম্ভবত যেখানে দফায় একটি শর্ত ব্যবহার করুন ...
ওসবার্ন

5

ফোন 1 বা (সম্ভবত আরও বেশি) ফোন 2 টি বাতিল না হওয়া পর্যন্ত প্রথমটি ভাল। সেক্ষেত্রে আপনি অভ্যন্তরীণ যোগদানের পরিবর্তে বাম জোড় ব্যবহার করতে চান।

আপনার কাছে দুটি ফোন নম্বর ক্ষেত্রের টেবিল থাকলে এটি সাধারণত খারাপ চিহ্ন। সাধারণত এর অর্থ আপনার ডাটাবেস ডিজাইনটি ত্রুটিযুক্ত।


দুর্দান্ত পয়েন্ট! এটি পরে আমার বড় মাথাব্যাথার কারণ হতে পারে ... ধন্যবাদ!
froadie

4

আপনি UNIONদুটি যোগ দানের জন্য ব্যবহার করতে পারেন :

SELECT Table1.PhoneNumber1 as PhoneNumber, Table2.SomeOtherField as OtherField
  FROM Table1
  JOIN Table2
    ON Table1.PhoneNumber1 = Table2.PhoneNumber
 UNION
SELECT Table1.PhoneNumber2 as PhoneNumber, Table2.SomeOtherField as OtherField
  FROM Table1
  JOIN Table2
    ON Table1.PhoneNumber2 = Table2.PhoneNumber

1
আমি এটি ভেবেছিলাম, তবে আমার এটি একক
অস্বীকৃত

ওহ ঠিক আছে, আমি বেশ অনেকটা বিপরীত ধরে নিয়েছি। যদি তা হয় তবে আমি এটি আপনার প্রথম পদ্ধতির মতো ব্যবহার করে করব। আমি আমার উত্তর সম্পাদনা করব।
পয়েন্টি

3

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

SELECT t.PhoneNumber1, t.PhoneNumber2, t.PhoneNumber3
   t1.SomeOtherFieldForPhone1, t2.someOtherFieldForPhone2, t3.someOtherFieldForPhone3
FROM 
(
 (
  Table1 AS t LEFT JOIN Table2 AS t3 ON t.PhoneNumber3 = t3.PhoneNumber
 )
 LEFT JOIN Table2 AS t2 ON t.PhoneNumber2 = t2.PhoneNumber
)
LEFT JOIN Table2 AS t1 ON t.PhoneNumber1 = t1.PhoneNumber;

2

প্রথম পদ্ধতিটি হ'ল সঠিক পদ্ধতি এবং আপনার যা প্রয়োজন তা করবে। যাইহোক, অভ্যন্তরীণ যোগদানের সাথে, Table1উভয় ফোন নম্বর উপস্থিত থাকলে আপনি কেবলমাত্র সারিগুলি নির্বাচন করবেন Table2। আপনি LEFT JOINএমনটি করতে চাইতে পারেন যাতে সমস্ত সারিটি Table1নির্বাচিত হয়। যদি ফোন নম্বরগুলি মেলে না, তবে SomeOtherFieldএসগুলি শূন্য হবে। আপনি যদি নিশ্চিত করতে চান যে আপনার কাছে কমপক্ষে একটি মিলে যাওয়া ফোন নম্বর রয়েছে তবে আপনি এটি করতে পারেনWHERE t2.PhoneNumber IS NOT NULL OR t3.PhoneNumber IS NOT NULL

দ্বিতীয় পদ্ধতিতে সমস্যা হতে পারে: যদি Table2উভয় থাকে PhoneNumber1এবং কী হয় PhoneNumber2? কোন সারিটি নির্বাচন করা হবে? আপনার ডেটা, বিদেশী কী ইত্যাদির উপর নির্ভর করে এটি সমস্যা হতে পারে বা নাও পারে।

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