একটি submary একাধিক ফলাফল একক কমা-বিভাজিত মান মধ্যে একত্রিত করুন


84

আমি দুটি টেবিল পেয়েছি:

TableA
------
ID,
Name

TableB
------
ID,
SomeColumn,
TableA_ID (FK for TableA)

সম্পর্ক এক সারি TableA- অনেকTableB

এখন, আমি এর মতো ফলাফল দেখতে চাই:

ID     Name      SomeColumn

1.     ABC       X, Y, Z (these are three different rows)
2.     MNO       R, S

এটি কাজ করবে না (একটি subquery একাধিক ফলাফল):

SELECT ID,
       Name, 
       (SELECT SomeColumn FROM TableB WHERE F_ID=TableA.ID)
FROM TableA

যদি আমি ক্লায়েন্টের পাশে প্রসেসিং করি তবে এটি একটি তুচ্ছ সমস্যা। তবে এর অর্থ হ'ল আমাকে প্রতিটি পৃষ্ঠায় এক্স ক্যোয়ারী চালাতে হবে, যেখানে এক্স এর ফলাফলের সংখ্যা TableA

নোট করুন যে আমি কেবল গ্রুপ বা অনুরূপ কিছু করতে পারি না, কারণ এটি সারিগুলির একাধিক ফলাফল প্রদান করবে TableA

আমি নিশ্চিত না যে কোনও ইউডিএফ, COALESCE ব্যবহার করে বা এর অনুরূপ কিছু কাজ করতে পারে?

উত্তর:


135

এমনকি এটি উদ্দেশ্যটি পরিবেশন করবে

নমুনা তথ্য

declare @t table(id int, name varchar(20),somecolumn varchar(MAX))
insert into @t
    select 1,'ABC','X' union all
    select 1,'ABC','Y' union all
    select 1,'ABC','Z' union all
    select 2,'MNO','R' union all
    select 2,'MNO','S'

প্রশ্ন:

SELECT ID,Name,
    STUFF((SELECT ',' + CAST(T2.SomeColumn AS VARCHAR(MAX))
     FROM @T T2 WHERE T1.id = T2.id AND T1.name = T2.name
     FOR XML PATH('')),1,1,'') SOMECOLUMN
FROM @T T1
GROUP BY id,Name

আউটপুট:

ID  Name    SomeColumn
1   ABC     X,Y,Z
2   MNO     R,S

13
এনটি নিশ্চিত না কেন এটি কোনও ব্যবহারকারীর ফাংশনের প্রয়োজন ছাড়াই সমস্যা সমাধানের কারণে এটি নেওয়া হয়নি। আপনি এখানে একই ধারণাটি প্রকাশ করতে পারেন কোডেকর্নার.galater.net/2009/06/25/… যা এই উত্তরটির পূর্বাভাস দেয় এবং তাই "আসল" হতে পারে
পল

4
এখানেও একই, নিশ্চিত হন না কেন এটি বেশি রেট দেওয়া হচ্ছে না
মার্সেল

4
হাই প্রিয়াঙ্কা, আপনি কি আমাকে বলতে পারবেন যে এখানে এবং কেন "এবং t1.name = t2.name" ধারাটি প্রয়োজনীয়?
কোইন

4
এটি দুর্দান্ত। আমি একটি ইউডিএফ ক্রিয়াকলাপটি গ্রহণযোগ্য উত্তরে উল্লিখিত হিসাবে অনুকূল করতে চেয়েছিলাম যা আমার সার্ভারটি হত্যা করছে। আমি একটি ১০২ সেকেন্ড অনুসন্ধান থেকে নীচে গিয়েছিলাম ১ টির চেয়ে কম এক্সিকিউশন প্ল্যানের তুলনা ছিল 78 78% -২২% তবে এটি মৃত্যুদণ্ডের সময়ের সাথে সম্পর্কিত নয় ...
toxaq

কেবলমাত্র একটি অনুস্মারক যে আপনার সেই নেতৃত্বের প্রয়োজন হবে ',' অন্যথায় আপনি আপনার আউটপুটে কোণ বন্ধনী দিয়ে শেষ করবেন।
টিম স্কার্বোরো

45

1. ইউডিএফ তৈরি করুন:

CREATE FUNCTION CombineValues
(
    @FK_ID INT -- The foreign key from TableA which is used 
               -- to fetch corresponding records
)
RETURNS VARCHAR(8000)
AS
BEGIN
DECLARE @SomeColumnList VARCHAR(8000);

SELECT @SomeColumnList =
    COALESCE(@SomeColumnList + ', ', '') + CAST(SomeColumn AS varchar(20)) 
FROM TableB C
WHERE C.FK_ID = @FK_ID;

RETURN 
(
    SELECT @SomeColumnList
)
END

২.উত্তোজনে ব্যবহার করুন:

SELECT ID, Name, dbo.CombineValues(FK_ID) FROM TableA

৩. আপনি যদি সঞ্চিত পদ্ধতি ব্যবহার করে থাকেন তবে আপনি এটির মতো করতে পারেন:

CREATE PROCEDURE GetCombinedValues
 @FK_ID int
As
BEGIN
DECLARE @SomeColumnList VARCHAR(800)
SELECT @SomeColumnList =
    COALESCE(@SomeColumnList + ', ', '') + CAST(SomeColumn AS varchar(20)) 
FROM TableB
WHERE FK_ID = @FK_ID 

Select *, @SomeColumnList as SelectedIds
    FROM 
        TableA
    WHERE 
        FK_ID = @FK_ID 
END

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

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

4
লজ্জাজনক কলামগুলি পরামিতি হতে পারে না। যেমনটি দাঁড়িয়েছে আপনাকে প্রতিটি সন্তানের সম্পর্কের জন্য একটি ফাংশন তৈরি করতে হবে!
জন পল জোন্স

4
ঠিক আছে - আমাকে কেবলমাত্র এই নির্দিষ্ট কলামগুলি একত্রিত করতে হবে। বাকিরা 'ট্র্যাডিশনাল' যোগ দেয়।
ডনি থমাস

এই পদ্ধতিটি না করে এটি করার সর্বোত্তম উপায় আমি মনে করি না।
এএফ।

11

আমি মনে করি আপনি COALESCE দিয়ে সঠিক পথে আছেন। কমা-বিস্মৃত স্ট্রিং তৈরির উদাহরণের জন্য এখানে দেখুন:

http://www.sqlteam.com/article/ using-coalesce-to-build-comma-delimited-string


4
অসাধারণ! আমি কিছু লিঙ্কগুলি COALESCE নিয়ে আলোচনা করতে দেখেছি, তবে তারা ট্রিগারগুলির সাথে ইউডিএফ তৈরির সাথে জড়িত। আপনার জমা দেওয়া লিঙ্কটিতে একটি একক নির্বাচনের বিবৃতি সহ কী রয়েছে। আমি সঠিক সমাধানের সাথে একটি উত্তর যুক্ত করছি, যাতে অন্যের পক্ষে এটি সন্ধান করা সহজ হয়। ধন্যবাদ!
ডনি থমাস

4
হাই বেন, আমি মনে করি উত্তরটির আরও কিছুটা বিশদ প্রয়োজন, যেমন কীভাবে ইউডিএফ তৈরি করা যায়, ইত্যাদি। আমি এটি বের করার পরে, আমি একটি সম্প্রদায় সম্পাদনাযোগ্য উত্তর হিসাবে সমাধানটি যুক্ত করব। এটি সম্পাদনা করতে নির্দ্বিধায় দয়া করে, যার পরে আমি উত্তর হিসাবে এটি গ্রহণ করব accept বিভ্রান্তির জন্য দুঃখিত.
ডনি থমাস

11

মাইএসকিউএলে একটি গ্রুপ_কনকাট ফাংশন রয়েছে যা আপনি যা চাইছেন তা ফিরিয়ে দেবে।

SELECT TableA.ID, TableA.Name, group_concat(TableB.SomeColumn) 
as SomColumnGroup FROM TableA LEFT JOIN TableB ON 
TableB.TableA_ID = TableA.ID

4
এটি নিখুঁত হত, যদি এসকিউএল সার্ভারে একই রকম ফাংশন থাকত। এটি যেমন দাঁড়িয়ে আছে, আমি যা চাই তা একত্রে হাতুড়ির জন্য বেনের সমাধানটি ব্যবহার করছি।
ডনি থমাস

0

আরও সুনির্দিষ্ট প্রতিক্রিয়ার জন্য আপনার আরও কিছু বিশদ সরবরাহের প্রয়োজন হতে পারে।

যেহেতু আপনার ডেটাসেটটি একরকম সংকীর্ণ বলে মনে হচ্ছে আপনি ফলাফলের জন্য কেবল একটি সারি ব্যবহার এবং ক্লায়েন্টে পোস্ট-প্রসেসিং সম্পাদন বিবেচনা করতে পারেন।

আপনি যদি সার্ভারকে সত্যিই কাজটি করতে চান তবে ফলাফলের মতো একটি ফলাফল সেট করুন

ID       Name       SomeColumn
1        ABC        X
1        ABC        Y
1        ABC        Z
2        MNO        R
2        MNO        S

কোনটি অবশ্যই আইডিতে একটি সাধারণ অন্তর্ভুক্ত O

একবার ক্লায়েন্টে রেজাল্টটি ফিরে এলে কারেন্টনেম নামে একটি ভেরিয়েবল বজায় রাখুন এবং যখন আপনি এটি করতে চান এমন দরকারী জিনিসটিতে সামমোকলম সংগ্রহ করা বন্ধ করার সময় ট্রিগার হিসাবে ব্যবহার করুন।


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

0

ধরে নিলাম আপনার টেবিলে কেবল যেখানে ক্লজ রয়েছে এটি একটি সঞ্চিত প্রক্রিয়া তৈরি করুন:

SELECT Id, Name From tableA WHERE ...

SELECT tableA.Id AS ParentId, Somecolumn 
FROM tableA INNER JOIN tableB on TableA.Id = TableB.F_Id 
WHERE ...

তারপরে একটি ডেটাসেট ডিএস পূরণ করুন। তারপর

ds.Relations.Add("foo", ds.Tables[0].Columns("Id"), ds.Tables[1].Columns("ParentId"));

অবশেষে আপনি পৃষ্ঠাটিতে একটি পুনরাবৃত্তি যুক্ত করতে পারেন যা প্রতিটি লাইনের জন্য কমা রাখে

 <asp:DataList ID="Subcategories" DataKeyField="ParentCatId" 
DataSource='<%# Container.DataItem.CreateChildView("foo") %>' RepeatColumns="1"
 RepeatDirection="Horizontal" ItemStyle-HorizontalAlign="left" ItemStyle-VerticalAlign="top" 
runat="server" >

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


0

আমি প্রিয়াঙ্কা সমাধানটি সমাধানের চেষ্টা করেছি। সরকার উল্লিখিত হয়েছে এবং ওপি যেমনটি বলেছে তেমন কার্যকর হয়নি। সমাধানটি এখানে দিয়ে শেষ করেছি:

SELECT ID, 
        SUBSTRING((
            SELECT ',' + T2.SomeColumn
            FROM  @T T2 
            WHERE WHERE T1.id = T2.id
            FOR XML PATH('')), 2, 1000000)
    FROM @T T1
GROUP BY ID

-1

সমাধান নীচে:

SELECT GROUP_CONCAT(field_attr_best_weekday_value)as RAVI
FROM content_field_attr_best_weekday LEFT JOIN content_type_attraction
    on content_field_attr_best_weekday.nid = content_type_attraction.nid
GROUP BY content_field_attr_best_weekday.nid

এটি ব্যবহার করুন, আপনি যোগদান করতে পারেন পরিবর্তন করতে পারেন


-1
SELECT t.ID, 
       t.NAME, 
       (SELECT t1.SOMECOLUMN 
        FROM   TABLEB t1 
        WHERE  t1.F_ID = T.TABLEA.ID) 
FROM   TABLEA t; 

এটি সাব কোয়েরি ব্যবহার করে বিভিন্ন টেবিল থেকে নির্বাচন করার জন্য কাজ করবে will


-1

আমি সমস্ত উত্তর পর্যালোচনা করেছি। আমি মনে করি ডাটাবেস সন্নিবেশ করা উচিত:

ID     Name      SomeColumn
1.     ABC       ,X,Y Z (these are three different rows)
2.     MNO       ,R,S

কমাটি আগের শেষে হওয়া উচিত এবং পছন্দ অনুসারে অনুসন্ধান করা উচিত %,X,%

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