অন্য কলামগুলি ফেরত দেওয়ার সময় একটি কলামে DISTINCT নির্বাচন করবেন?


12

আমার একটি ক্যোয়ারী রয়েছে যা আমার প্রয়োজনীয় সমস্ত তথ্য পেতে তিনটি লুক টেবিল ব্যবহার করে। আমার DISTINCTএকটি কলামের মান থাকতে হবে , তবে এর সাথে যুক্ত বাকী ডেটাও আমার দরকার।

আমার এসকিউএল কোড:

SELECT acss_lookup.ID AS acss_lookupID,
   acss_lookup.product_lookupID AS acssproduct_lookupID,
   acss_lookup.region_lookupID AS acssregion_lookupID,
   acss_lookup.document_lookupID AS acssdocument_lookupID,
   product.ID AS product_ID,
   product.parent_productID AS productparent_product_ID,
   product.label AS product_label,
   product.displayheading AS product_displayheading,
   product.displayorder AS product_displayorder,
   product.display AS product_display,
   product.ignorenewupdate AS product_ignorenewupdate,
   product.directlink AS product_directlink,
   product.directlinkURL AS product_directlinkURL,
   product.shortdescription AS product_shortdescription,
   product.logo AS product_logo,
   product.thumbnail AS product_thumbnail,
   product.content AS product_content,
   product.pdf AS product_pdf,
   product.language_lookupID AS product_language_lookupID,
   document.ID AS document_ID,
   document.shortdescription AS document_shortdescription,
   document.language_lookupID AS document_language_lookupID,
   document.document_note AS document_document_note,
   document.displayheading AS document_displayheading
FROM acss_lookup
     INNER JOIN product ON (acss_lookup.product_lookupID = product.ID)
     INNER JOIN document ON (acss_lookup.document_lookupID = document.ID)
ORDER BY product_displayheading ASC;

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

এটা কি খুব জটিল? আমার আরও সহজ সরল পদ্ধতি ব্যবহার করা উচিত?


তবে একটি পণ্য অনেকগুলি নথির সাথে সম্পর্কিত। এবং আপনার ক্যোয়ারী সেগুলি সমস্ত ফেরত দেয় (কোনও পণ্যের জন্য নথি)। কোনটি বেছে নেওয়া উচিত?
ypercubeᵀᴹ

উত্তর:


7

এখনও উল্লেখ করা হয়নি আরও একটি পদ্ধতির উইন্ডো ফাংশন ব্যবহার করা হয়, উদাহরণস্বরূপ সারি_সংখ্যার:

   SELECT * FROM  
   (
   SELECT acss_lookup.ID AS acss_lookupID, 
   ROW_NUMBER() OVER 
   (PARTITION BY your_distinct_column ORDER BY any_column_you_think_is_appropriate)
   as num,
   acss_lookup.product_lookupID AS acssproduct_lookupID,
   acss_lookup.region_lookupID AS acssregion_lookupID,
   acss_lookup.document_lookupID AS acssdocument_lookupID,
   product.ID AS product_ID,
   product.parent_productID AS productparent_product_ID,
   product.label AS product_label,
   product.displayheading AS product_displayheading,
   product.displayorder AS product_displayorder,
   product.display AS product_display,
   product.ignorenewupdate AS product_ignorenewupdate,
   product.directlink AS product_directlink,
   product.directlinkURL AS product_directlinkURL,
   product.shortdescription AS product_shortdescription,
   product.logo AS product_logo,
   product.thumbnail AS product_thumbnail,
   product.content AS product_content,
   product.pdf AS product_pdf,
   product.language_lookupID AS product_language_lookupID,
   document.ID AS document_ID,
   document.shortdescription AS document_shortdescription,
   document.language_lookupID AS document_language_lookupID,
   document.document_note AS document_document_note,
   document.displayheading AS document_displayheading
   FROM acss_lookup
     INNER JOIN product ON (acss_lookup.product_lookupID = product.ID)
     INNER JOIN document ON (acss_lookup.document_lookupID = document.ID)
   )a
   WHERE a.num = 1
   ORDER BY product_displayheading ASC;

@ a1ex07- ধন্যবাদ! কাজ করেছে। যতবারই আমি নেট থেকে কিছু উদাহরণ মানিয়ে নেওয়ার চেষ্টা করেছি, এটি আমার জিনগুলিই আমাকে বিভ্রান্ত করেছিল, তবে আমি মনে করি এটি এখনই পেয়েছি।
স্টেফমোরল্যান্ড

আপনার জিজ্ঞাসিত ডেটাটি ন্যূনতম করতে এবং উইন্ডো ফাংশন থেকে নাম্বার = 1 নির্বাচন করে কেবল "ফেলে দিতে" নকল করতে ডুপ্লিকেট না করে উপাত্তের বাইরে যোগ দেওয়া ভাল।
অ্যালান এস হানসেন

4

এটি করার কয়েকটি উপায় রয়েছে। আমি যে দুটি প্রধান ব্যবহার করব তা হ'ল সাধারণ টেবিল এক্সপ্রেশন এবং উপ-প্রশ্ন। সিটিই ব্যবহার করে আপনার ক্যোয়ারীটি এরকম কিছু দেখাচ্ছে:

WITH theResultSet AS
(
    SELECT DISTINCT(column) AS col1 FROM some.table
)
SELECT whatever
  FROM more.data AS a
  JOIN theResultSet as b ON a.col1 = b.col1
  /* additional joins, clauses etc...*/

বা একটি subquery ব্যবহার:

SELECT whatever
  FROM more.data AS a
  JOIN (SELECT DISTINCT(column) AS col1 FROM some.table) AS b ON a.col1 = b.col1
/* additional joins, clauses etc... */

আমি সাধারণত কোনটি দ্রুত তা পরীক্ষা করে দেখি এবং এটির সাথে যেতে পারি।

আমি আশা করি এটা আপনাকে সাহায্য করবে।


আমি ভেবেছিলাম আমি আপনার উত্তরটি বুঝতে পেরেছি তাই এটি চেষ্টা করেছিলাম (প্রথমটি), তবে আমি মনে করি আমার জিনগুলি আপনার সমাধানের জিনগুলিতে সমস্যা সৃষ্টি করছে।
স্টেফমোরল্যান্ড

কলামটি কী আলাদা হওয়া দরকার? আমি আপনার জন্য আরও ব্যাপক সমাধান পোস্ট করব।
মিঃ ব্রাউনস্টোন

product.displayheading কলামটি
স্টেফমোরল্যান্ড

1

(আমি মনে করি আপনি যা করতে চেষ্টা করছেন তা প্রতিটি ফলাফলকে একক পণ্যকে সরিয়ে "ধসে" ফেলেছে, সুতরাং এই উত্তরটি সেই অনুমানের দিকে চলেছে))

যদি সম্ভব না হয়. অন্যান্য টেবিল থেকে সম্পর্কিত 1 .. * ডেটা পেতে, আপনাকে অন্যান্য কলামগুলিতে সদৃশ মানগুলি ফিরিয়ে দিতে হবে।

সাধারণত এটি হ্যান্ডেল করার উপায়টি হল কোয়েরিটি যেমন হয় তেমন চালানো এবং অ্যাপ্লিকেশন কোডে যোগদানের ফলাফল সেট করা প্রক্রিয়া করে। আমি সাধারণত হ্যাশ সংগ্রহের পদ্ধতির সাহায্যে এটি করি যা কোনও মূল্যের উপর ভিত্তি করে সংগ্রহে প্রতিটি ধরণের স্বতন্ত্র সত্তা দিয়ে শেষ হয়।

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

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