লিনকিউ থেকে এসকিউএল: একাধিক কলামে একাধিক যোগদান করে। এটা কি সম্ভব?


131

প্রদত্ত:

TABLE_1নিম্নলিখিত কলামগুলির সাথে নামযুক্ত একটি সারণী :

  • ID
  • ColumnA
  • ColumnB
  • ColumnC

আমি SQL কোয়েরি যেখানে আছে TABLE_1দুইবার বন্ধ ভিত্তিক নিজেই যোগদান করে ColumnA, ColumnB, ColumnC। ক্যোরিয়াকে এরকম কিছু দেখতে পাওয়া যেতে পারে:

Select t1.ID, t2.ID, t3.ID
  From TABLE_1 t1
  Left Join TABLE_1 t2 On
       t1.ColumnA = t2.ColumnA
   And t1.ColumnB = t2.ColumnB
   And t1.ColumnC = t2.ColumnC
  Left Join TABLE_1 t3 On
       t2.ColumnA = t3.ColumnA
   And t2.ColumnB = t3.ColumnB
   And t2.ColumnC = t3.ColumnC
... and query continues on etc.

সমস্যা:

আমার ক্যোরিটি লিনকিউতে আবার লিখতে হবে। আমি এতে ছুরিকাঘাত করার চেষ্টা করেছি:

var query =
    from t1 in myTABLE1List // List<TABLE_1>
    join t2 in myTABLE1List
      on t1.ColumnA equals t2.ColumnA
      && t1.ColumnB equals t2.ColumnA
    // ... and at this point intellisense is making it very obvious
    // I am doing something wrong :(

আমি কীভাবে আমার প্রশ্নটি লিনকুতে লিখব? আমি কি ভুল করছি?

উত্তর:


242

লিনক থেকে এসকিউএল এর একাধিক কলামে যোগদান করা কিছুটা আলাদা।

var query =
    from t1 in myTABLE1List // List<TABLE_1>
    join t2 in myTABLE1List
      on new { t1.ColumnA, t1.ColumnB } equals new { t2.ColumnA, t2.ColumnB }
    ...

আপনাকে বেনামে প্রকারের সুবিধা নিতে হবে এবং আপনি যে একাধিক কলামের সাথে তুলনা করতে চান তার জন্য একটি প্রকার রচনা করতে হবে।

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

এডিআইটি মন্তব্যের ভিত্তিতে দ্বিতীয় যোগদানের উদাহরণ যুক্ত করা।

var query =
    from t1 in myTABLE1List // List<TABLE_1>
    join t2 in myTABLE1List
      on new { A = t1.ColumnA, B = t1.ColumnB } equals new { A = t2.ColumnA, B = t2.ColumnB }
    join t3 in myTABLE1List
      on new { A = t2.ColumnA, B =  t2.ColumnB } equals new { A = t3.ColumnA, B = t3.ColumnB }
    ...

4
এটি দুটি যোগদানের জন্য দুর্দান্ত কাজ করে। তিনটি যোগদানের সাথে এটি কাজ করা আমার দরকার। দুঃখিত, দ্বিতীয় কোড ব্লকটি কিছুটা বিভ্রান্তিকর ছিল।
অ্যারোনা

46
টাইপ অনুমান সম্পর্কে আপনি যদি একটি সংকলক ত্রুটি পেয়ে থাকেন তবে দুটি জিনিস পরীক্ষা করুন, (1) প্রকারগুলি একই এবং (2) কলামের নাম একই। নামগুলির অংশটি একটি গোটচা। এই উদাহরণটি সমস্ত কলামগুলি ভের্যাচর হলেও সংকলন করবে না join T2 in db.tbl2 on new { T1.firstName, T1.secondName } equals new { T2.colFirst, T2.colSecond }। আপনি যদি এটিতে এটি পরিবর্তন করেন তবে এটি সংকলন করবেjoin T2 in db.tbl2 on new { N1 = T1.firstName, N2 = T1.secondName } equals new { N1 = T2.colFirst, N2 = T2.colSecond }
ব্যবহারকারী 2023861

4
নামকরণ সমস্যাটি T1 থেকে myTABLE1 এর মাধ্যমে নাম নির্ধারণ করা যেতে পারে myTABLE1 তালিকায় যোগদান করুন T2LE1 নতুন {colA = t1.COLNMA, কলবি = t1. પર কলম্ববি} সমান নতুন {colA = t2. ColumnA, colBBt2. ColumnB}
বাকের নকভি

1
অনুগ্রহ করে আমাকে উদাহরণ সম্পাদনা করার অনুমতি দিন, কারণ এটি বেনামে সম্পত্তি হিসাবে অ্যাসাইনমেন্টের প্রয়োজন ছিল
এসমার্ক

1
লিনকু দিয়ে এখানে কিছু ভুল। আমি একাধিক টেবিলগুলিতে যোগদান করতে পারি, আমি একাধিক ক্ষেত্রে যোগ দিতে পারি ... তবে আমি উভয়ের পক্ষে এটি করতে পারি না, যেমন উদাহরণটি এখানে দেখায়। সুতরাং বলুন যে আপনি কেবলমাত্র 1 টি ফিল্ডে যোগদান করেছেন .. এবং এটি অনুসরণ করার সাথে আপনার দ্বিতীয়বার যোগ হবে। আপনি যদি নতুন {x.field} সমান নতুন {y.field use ব্যবহার করতে প্রথম জোড় (বা উভয়) পরিবর্তন করেন তবে একটি সংকলক ত্রুটি রয়েছে। কার্যত আপনি কিছু পরিবর্তন করেন নি। নেট নেট 4.6.1 ব্যবহার করা হচ্ছে।
ব্যবহারকারী 2415376

12

লিনকুইএসএসকিউএলে অভ্যন্তরীণ যোগদানগুলি ব্যবহার করার সময় আপনাকে খুব কমই স্পষ্টভাবে যোগ দিতে হবে।

আপনার ডাটাবেসে আপনার যদি যথাযথ বিদেশী কী সম্পর্ক থাকে তবে আপনি স্বয়ংক্রিয়ভাবে লিনকিউ ডিজাইনারের সাথে একটি সম্পর্ক পাবেন (যদি না হয় তবে আপনি ডিজাইনারে ম্যানুয়ালি সম্পর্ক তৈরি করতে পারেন, যদিও আপনার ডাটাবেসে আপনার সত্যিকারের সম্পর্ক থাকতে হবে)

পিতা-মাতার সন্তানের সম্পর্ক

তারপরে আপনি "ডট-নোটেশন" দিয়ে কেবল সম্পর্কিত টেবিলগুলিতে অ্যাক্সেস করতে পারবেন

var q = from child in context.Childs
        where child.Parent.col2 == 4
        select new
        {
            childCol1 = child.col1,
            parentCol1 = child.Parent.col1,
        };

ক্যোয়ারী উত্পন্ন করবে

SELECT [t0].[col1] AS [childCol1], [t1].[col1] AS [parentCol1]
FROM [dbo].[Child] AS [t0]
INNER JOIN [dbo].[Parent] AS [t1] ON ([t1].[col1] = [t0].[col1]) AND ([t1].[col2] = [t0].[col2])
WHERE [t1].[col2] = @p0
-- @p0: Input Int (Size = -1; Prec = 0; Scale = 0) [4]
-- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 4.0.30319.1

আমার মতে এটি অনেক বেশি পাঠযোগ্য এবং আপনাকে আপনার বিশেষ অবস্থার প্রতি মনোনিবেশ করতে দেয়, যোগদানের আসল যান্ত্রিকতা নয়।

সম্পাদনা
এটি তখনই প্রযোজ্য যখন আপনি আমাদের ডাটাবেস মডেলটির সাথে লাইনে যোগদান করতে চান। হিসেবে যোগদান করে আপনি "মডেল বাহিরে" যোগদান করতে চান তাহলে আপনি যদি ম্যানুয়াল অবলম্বন প্রয়োজন উত্তর থেকে Quintin রবিনসন


11

শিরোনাম_ লেখকরা একবারে প্রকল্পের ফলাফলগুলিতে দু'টি জিনিস যোগদান করে শৃঙ্খলা চালিয়ে যাওয়া look

        DataClasses1DataContext db = new DataClasses1DataContext();
        var queryresults = from a in db.Authors                                          
                    join ba in db.Title_Authors                           
                    on a.Au_ID equals ba.Au_ID into idAuthor
                    from c in idAuthor
                    join t in db.Titles  
                    on c.ISBN equals t.ISBN 
                    select new { Author = a.Author1,Title= t.Title1 };

        foreach (var item in queryresults)
        {
            MessageBox.Show(item.Author);
            MessageBox.Show(item.Title);
            return;
        }

10

আপনি এটি ব্যবহার করতে পারেন:

var query =
    from t1 in myTABLE1List 
    join t2 in myTABLE1List
      on new { ColA=t1.ColumnA, ColB=t1.ColumnB } equals new { ColA=t2.ColumnA, ColB=t2.ColumnB }
    join t3 in myTABLE1List
      on new {ColC=t2.ColumnA, ColD=t2.ColumnB } equals new { ColC=t3.ColumnA, ColD=t3.ColumnB }

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

3

আমি অন্য একটি উদাহরণ দিতে চাই যেখানে একাধিক (3) যোগদান করে।

 DataClasses1DataContext ctx = new DataClasses1DataContext();

        var Owners = ctx.OwnerMasters;
        var Category = ctx.CategoryMasters;
        var Status = ctx.StatusMasters;
        var Tasks = ctx.TaskMasters;

        var xyz = from t in Tasks
                  join c in Category
                  on t.TaskCategory equals c.CategoryID
                  join s in Status
                  on t.TaskStatus equals s.StatusID
                  join o in Owners
                  on t.TaskOwner equals o.OwnerID
                  select new
                  {
                      t.TaskID,
                      t.TaskShortDescription,
                      c.CategoryName,
                      s.StatusName,
                      o.OwnerName
                  };

9
একই জিনিস নয় - প্রশ্নটি প্রতিটি একাধিক কলামের ভিত্তিতে সারণিতে যোগদানের বিষয়ে, প্রতিটি একক কলামের ভিত্তিতে একাধিক টেবিলগুলিতে যোগদান না করার বিষয়ে।
বিচ্ছিন্ন

1

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

from t1 in Table1 
join t2 in Table2 
on new {X = t1.Column1, Y = 0 } on new {X = t2.Column1, Y = t2.Column2 }
select new {t1, t2}

-6

আমার মতে, একাধিক ক্ষেত্রের সাথে দুটি সারণিতে যোগদানের এটি সহজতম উপায়:

from a in Table1 join b in Table2    
       on (a.Field1.ToString() + "&" + a.Field2.ToString())     
       equals  (b.Field1.ToString() + "&" + b.Field2.ToString())  
     select a

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

-10

আপনি আপনার ক্যোয়ারীটি এভাবে লিখতে পারেন।

var query = from t1 in myTABLE1List // List<TABLE_1>
            join t2 in myTABLE1List
               on t1.ColumnA equals t2.ColumnA
               and t1.ColumnB equals t2.ColumnA

আপনি যদি নিজের কলামটি একাধিক কলামের সাথে তুলনা করতে চান।


1
@ ব্যবহারকারী 658720 স্ট্যাকওভারফ্লোতে স্বাগতম: :)। আমি আপনাকে পরামর্শ দিচ্ছি যে আপনি কোডটি বিন্যাস করুন যাতে এটি পড়া সহজ হয়। আপনি পাঠ্যটি নির্বাচন করতে পারেন এবং সম্পাদকের কোড বোতামটি ক্লিক করতে পারেন।
অ্যারোনা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.