জটিল এসকিউএল কোয়েরিগুলি কীভাবে সহজ লেখা যায়? [বন্ধ]


42

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

নোট করুন যে আমি যে এসকিউএলকে লিখতে বলা হয়েছি তা একটি ডাটাবেস কোর্সের হোমওয়ার্ক অ্যাসাইনমেন্টের অংশ, সুতরাং আমি এমন সফ্টওয়্যার চাই না যা আমার জন্য কাজ করবে। আমি যে কোডটি লিখছি তা আসলে বুঝতে চাই।

আরও প্রযুক্তিগত বিবরণ:

  • স্থানীয় মেশিনে চলমান পোস্টগ্রিএসকিউএল সার্ভারে ডাটাবেসটি হোস্ট করা হয়েছে।
  • ডাটাবেসটি খুব ছোট: সাতটি টেবিলের বেশি নেই এবং বৃহত্তম সারণীতে প্রায় 50 টিরও কম সারি রয়েছে।
  • এসকিউএল কোয়েরিগুলি লিবারঅফিস বেসের মাধ্যমে সার্ভারে অপরিবর্তিতভাবে পাস করা হচ্ছে।

অস্থায়ী দর্শনগুলি আসলে বেশ কার্যকর কারণ আপনি যেমন একটি টেবিলের (যেমন সুস্পষ্ট জটিল সূচকগুলির) কাজ করতে পারেন যা এসকিউএল পার্সারকে ইঙ্গিত করা খুব শক্ত।

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

উত্তর:


49

আমি এর বেশিরভাগ ভিত্তি কেবল "সঠিক" উত্তর পাওয়ার চেষ্টা করছি, যাতে আপনি আবিষ্কার করতে পারেন যে এখানে কিছু কার্য সম্পাদনের সমস্যা রয়েছে। একটি ভুল ক্যোয়ারী গতি বাড়ানোর কোনও মানে নেই।

টেবিলের সম্পর্কগুলি বুঝুন - বেশিরভাগের মধ্যে এক হবে। "অনেকগুলি" টেবিলটি জানুন। আপনার যোগদানের জন্য প্রয়োজনীয় ক্ষেত্রগুলি শনাক্ত করুন।

বাম দিকের যোগদানের পরিস্থিতিতে ভাবুন - গত মাস থেকে সমস্ত কর্মচারী এবং তাদের বেতন নির্বাচন করুন। তারা যদি গত মাসে বেতন-পিক না পেয়ে থাকে?

ফলাফল সেটটি জানুন: 1) একটি স্প্রেডশিটে, ম্যানুয়ালি আপনার প্রশ্নের জন্য কমপক্ষে একটি সঠিক রেকর্ড লিখুন। 2) কতগুলি রেকর্ডার ফিরিয়ে দেওয়া উচিত তা সনাক্ত করার জন্য একটি সহজ পর্যায়ে ক্যোয়ারী লিখুন। কোনও নতুন টেবিলে যোগদানের ফলে ফলাফলটি পরিবর্তিত হবে না তা নিশ্চিত করতে আপনার কোয়েরিটি পরীক্ষা করতে উভয়টিই ব্যবহার করুন।

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

একত্রিতকরণের মিশ্র স্তরের থেকে সাবধান থাকুন : যদি আপনাকে একই ফলাফল সেটে মাসিক, ত্রৈমাসিক এবং বছর-তারিখের মানগুলি রাখতে হয়, আপনাকে আলাদা আলাদা মানগুলিতে শ্রেণিবদ্ধ কোয়েরিতে এগুলি আলাদাভাবে গণনা করতে হবে।

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

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

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


1
সত্যিই দুর্দান্ত জিনিস। আমি LEFT যোগদানের জন্য এবং জটিল প্রশ্নগুলিকে আরও ছোট, আরও পরিচালনাযোগ্য এবং তারপরে সংযুক্ত করার বিষয়ে জেফের পয়েন্টগুলি পুনর্বিবেচনা করতে চাই e আমি প্রতিদিন বড় ডেটাবেজে বড় প্রশ্নগুলি লিখি এবং বিশেষত এই দুটি জিনিস সমস্ত সময় উপস্থিত হয়। আপনি প্রতিটি পদক্ষেপে যে প্রত্যাশাটি দেখেছেন বলে আপনি আশা করছেন তা নিশ্চিত করার জন্য সর্বদা আপনার প্রশ্ন এবং উপ-প্রশ্নগুলি যত তাড়াতাড়ি সম্ভব চালনা করুন।
কোডেক্সআর্কানিয়াম

@ কোডেক্সআরকানাম - এবং আপনি যখন বড় ডেটাতে অনুসন্ধান চালান, টপ ব্যবহার করতে কোনও ক্ষতি হয় না;)
জেফো

আমি আপনার পরামর্শের প্রতিটি বক্তব্যের সাথে একমত
অলেসান্দ্রো রসি

28
  1. আপনি যদি ইতিমধ্যে এটি না করে থাকেন তবে সূচনাটি প্রথম কাজ হবে do এটি কেবল সাধারণ অনুসন্ধানগুলির সাথেই কার্যকর নয়, এটি একটির চেয়ে কিছুটা জটিল এবং যোগদানের ক্ষেত্রে প্রশ্নগুলির ক্ষেত্রে গুরুত্বপূর্ণ select top 1 [ColumnName] from [TableName]

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

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

  3. টেবিল, কলাম, ইত্যাদির উপর একই স্টাইল প্রয়োগ করা পঠনযোগ্যতাকে অনেক বেশি সহায়তা করে। একটি লিগ্যাসি ডাটাবেস সারণি আছে যখন PRODUCT, users, USERS_ObsoleteDONT_USE, PR_SHIPMENTSএবং HRhbYd_UU, কারো কিছু খুব ভুল করছে।

  4. প্রশ্নের উপর একই স্টাইল প্রয়োগ করাও গুরুত্বপূর্ণ। উদাহরণস্বরূপ, যদি আপনি মাইক্রোসফ্ট এসকিউএল সার্ভারের জন্য প্রশ্ন লিখছেন এবং আপনি [TableName]পরিবর্তে ব্যবহার করার সিদ্ধান্ত নিয়েছেন TableName, তবে এটি আটকে দিন। আপনি যদি কোনও এর পরে কোনও নতুন লাইনে যান তবে selectএটি কেবল আপনার প্রশ্নের অর্ধেক অংশে করবেন না, তবে তার সবকটিই।

  5. ব্যবহার করবেন না* , যদি না সেখানে শক্তিশালী কারণে (মত এটা করতে হয় if exists(select * from [TableName] where ...)মাইক্রোসফট SQL সার্ভার মধ্যে)। শুধু *ডাটাবেস কিছু নেতিবাচক কর্মক্ষমতা প্রভাব (অধিকাংশ যদি না) আছে, কিন্তু এটি ডেভেলপার যারা আপনার প্রশ্নের ব্যবহার জন্য সহায়ক নয়। একইভাবে, কোনও বিকাশকারীকে অবশ্যই নাম দ্বারা মানগুলি অ্যাক্সেস করতে হবে, কখনই সূচী দ্বারা নয়।

  6. পরিশেষে, বাছাইকারীদের জন্য, ভিউ সরবরাহ করার ক্ষেত্রে কোনও ভুল নেই । অন্য যে কোনও কিছুর জন্য, সঞ্চিত পদ্ধতিগুলি প্রকল্প এবং আপনার সাথে কাজ করা লোকের উপর নির্ভর করে ব্যবহার করা যেতে পারে।


¹ কিছু লোক সঞ্চিত পদ্ধতিগুলি ঘৃণা করে। অন্যরা বেশ কয়েকটি (নিখুঁতভাবে বৈধ, কমপক্ষে তাদের জন্য) কারণে তাদের পছন্দ করে না।

Colleagues আপনার সহকর্মীরা, অন্যান্য শিক্ষার্থী, আপনার শিক্ষক ইত্যাদি


9

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

সুতরাং, অস্থায়ী ভিউ বি তে টেবিল A ​​তে যোগদানের পরিবর্তে আপনি অস্থায়ী দর্শন হিসাবে বি ব্যবহার করছেন যে ক্যোয়ারিতে টেবিল A ​​তে যোগ দিতে পারেন example উদাহরণস্বরূপ:

    SELECT A.Col1, A.Col2, B.Col1,B.Col2
      FROM (SELECT RealTableZ.Col1, RealTableY.Col2, RealTableY.ID as ID
              FROM RealTableZ 
   LEFT OUTER JOIN RealTableY
                ON RealTableZ.ForeignKeyY=RealTableY.ID
             WHERE RealTableY.Col11>14
            ) As B
        INNER JOIN A
                ON A.ForeignKeyY=B.ID

এই উদাহরণটি বরং অর্থহীন, তবে বাক্য গঠনটি ব্যাখ্যা করা উচিত।

"বিশেষ" নয় এমন দর্শনগুলির জন্য (সূচীকৃত, পার্টিশনযুক্ত) এটির জন্য একই ক্যোয়ারী পরিকল্পনার ফলস্বরূপ এমন হওয়া উচিত যেমন আপনি কোনও ভিউ ব্যবহার করেছেন।

যতদূর সহজেই এটি লিখতে সহজ করা হয়েছে, পুরো কোয়েরিটি লেখার আগে আপনি যা প্রত্যাশা করছেন তা পাচ্ছেন কিনা তা নিশ্চিত করতে আপনি প্রতিটি টুকরো যাচাই করতে পারেন।

এটি যদি আপনার কাছে ইতিমধ্যে পুরানো টুপি হয় তবে আমার ক্ষমা চাই।


3
আমি এসকিউএল সম্পর্কে বেশ বিশেষজ্ঞ এবং আমি এই প্রসারণটি সত্যই ঘৃণা করি: এটি দেখতে সুন্দর লাগতে পারে তবে এটি "আমার মতে" সম্পূর্ণ অকেজো। দুটি কারণ: আমি যদি স্পষ্টভাবে বুঝতে পারি না যে যদি এই বাম দিকের বাইরের যোগটি মূল ক্যোয়ারির অংশ বা একটি সাবকোয়ারির অংশ হয় তবে এটির জন্য একটি কোড বিউটিফায়ার প্রয়োজন হয় এবং যে কোনও সময় আপনি কয়েকটি লাইন যুক্ত করতে চান আপনাকে সমস্ত পাঠ্যটি পুনরায় সাজানোর জন্য প্রয়োজন । প্লেন ইন্ডেন্টেশন যা কেবলমাত্র টিএবিএস প্রয়োজন আরও অনেক নমনীয়। আমি আপনার জবাবটি কম ভোট দিলাম না তবে এই স্টাইলটি ব্যবহার করে আমি সত্যিই নিরুৎসাহিত হয়েছি ... বিশেষত যখন তাদের আমার সাহায্যের প্রয়োজন হয়।
আলেসান্দ্রো রসি 10

7

অস্থায়ী দর্শনগুলির পরিবর্তে WITH ধারাটি ব্যবহার করুন । এটি বৃহত্তর প্রশ্নগুলি আরও বেশি পঠনযোগ্য ছোট অংশগুলিতে বিভক্ত করা আরও সহজ করে তোলে।


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

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

1

অন্য যে কোনও কিছুর মতো আপনিও সমস্যাটি পরিচালনা করার যোগ্য অংশগুলিতে ভাঙতে চান।

আসলেই আপনি কীভাবে জটিল সমস্যাগুলি সমাধান করেন।

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

একটি এসকিউএল বিবৃতি, এটি জটিলতার একটি নির্দিষ্ট স্তরে পৌঁছে গেলে মূলত এবং নিজের মধ্যে একটি সামান্য প্রোগ্রাম। এটি কীভাবে ডেটা সংযুক্ত, নির্বাচিত, ফিল্টার এবং আউটপুট যুক্ত তা সত্যিই বুঝতে বড় পার্থক্য করে।

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