View Full Version : سوال: join دو جدول با تعداد رکوردهای متفاوت
  
Reza798
یک شنبه 12 دی 1389, 09:02 صبح
من قصد دارم دو جدول را با هم join کنم ولی در جدول دوم به ازای هر رکورد از جدول اول چند رکورد قرار دارد
چگونه می شود از جدول دوم فقط Top 1 آن را(با شرطی خاص) با رکوردهای جدول اول join کرد به طوریکه به ازای هر ID از جدول اول فقط یک رکورد در خروجی باشد
Reza_Yarahmadi
یک شنبه 12 دی 1389, 11:12 صبح
با فرض اينكه 2 جدول فيلد Id داشته باشند و اين فيلد يونيك باشه (فرضا identity باشه) ميتونيد بصورت زير عمل كنيد.
With Dis as(
Select 
    Min(ID) as MinID
From
    tbl2
Where
    YourCondition
Group By
    ForeignField
)
,DisData as(
Select 
    t2.*
From
    Dis d Inner Join tbl2 t2
On
    d.MinID = t2.ID
)
Select
    *
From
    tbl1 t1 Inner Join DisData d
On 
    t1.Id = d.ForeignField
توي اين دستور ابتدا كوچكترين Id با شرايطي كه ميخواستيد رو پيدا ميكنه ، بعد اطلاعات كوچكترين Id ها بدست مياد ، بعد جدول اصلي با اطلاعات مرحله قبل Join ميشه و ...
Reza798
یک شنبه 12 دی 1389, 21:23 عصر
سلام 
آقا رضا این روش که اصلا هیچی بر نمی گردانه - اگه بخوام از order by هم استفاده کنم کار نمی کنه
Reza_Yarahmadi
یک شنبه 12 دی 1389, 22:23 عصر
دوست عزیز این یک نمونه کد بود.
من از جداول شما ، فیلدهای اونها ، رابطه بین اونها ، شرط خاص مورد نظرتون و .... خبر ندارم تا بتونم کدی که جواب میده رو بذارم. در صورت امکان فیلدهای جدولها ، رابطه بین اونها ، چند نمونه داده ذخیره شده در جدولها و نتیجه مورد نظرتون رو اینجا بذارید تا بهتر بشه کمکتون کرد.
Reza798
دوشنبه 13 دی 1389, 12:38 عصر
دوست عزیز این یک نمونه کد بود.
من از جداول شما ، فیلدهای اونها ، رابطه بین اونها ، شرط خاص مورد نظرتون و .... خبر ندارم تا بتونم کدی که جواب میده رو بذارم. در صورت امکان فیلدهای جدولها ، رابطه بین اونها ، چند نمونه داده ذخیره شده در جدولها و نتیجه مورد نظرتون رو اینجا بذارید تا بهتر بشه کمکتون کرد.
سلام 
 
Customer(Cust_Id,name,family)
Tels(Cust_Id,TelNo,main)
main نشان می دهد شماره اصلی مشتری است یا نه 
از نوع bit
مرتب کردن شماره ها براساس اصلی بودن
Select Telno from Tels
order by Main desc
حالا میخوام به ازای هر مشتری یک شماره نشان بدم براساس لیست مرتب شده بالا یعنی شماره اصلی اولویت داره
Reza_Yarahmadi
دوشنبه 13 دی 1389, 12:58 عصر
با دستوري مثل دستور زير فكر كنم به جواب مورد نظرتون برسيد
With Tels2 as(
    Select 
        Row_Number() Over(Order By Main desc) as RowId,
        *
    From
        Tels
)
, Dis as(
    Select 
        Min(RowId) as MinID
    From
        Tels2
    Group By
        Cust_Id
)
,DisData as(
    Select 
        t2.*
    From
        Dis d Inner Join Tels2 t2
    On
        d.MinID = t2.RowId
)
Select
    c.Cust_Id,
    c.Name,
    c.family,
    d.TelNo
From
    Customer c Inner Join DisData d
On 
    c.Cust_Id = d.Cust_Id
 
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.