PDA

View Full Version : سوال: join دو جدول با تعداد رکوردهای متفاوت



Reza798
یک شنبه 12 دی 1389, 08:02 صبح
من قصد دارم دو جدول را با هم join کنم ولی در جدول دوم به ازای هر رکورد از جدول اول چند رکورد قرار دارد
چگونه می شود از جدول دوم فقط Top 1 آن را(با شرطی خاص) با رکوردهای جدول اول join کرد به طوریکه به ازای هر ID از جدول اول فقط یک رکورد در خروجی باشد

Reza_Yarahmadi
یک شنبه 12 دی 1389, 10: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, 20:23 عصر
سلام

آقا رضا این روش که اصلا هیچی بر نمی گردانه - اگه بخوام از order by هم استفاده کنم کار نمی کنه

Reza_Yarahmadi
یک شنبه 12 دی 1389, 21:23 عصر
دوست عزیز این یک نمونه کد بود.
من از جداول شما ، فیلدهای اونها ، رابطه بین اونها ، شرط خاص مورد نظرتون و .... خبر ندارم تا بتونم کدی که جواب میده رو بذارم. در صورت امکان فیلدهای جدولها ، رابطه بین اونها ، چند نمونه داده ذخیره شده در جدولها و نتیجه مورد نظرتون رو اینجا بذارید تا بهتر بشه کمکتون کرد.

Reza798
دوشنبه 13 دی 1389, 11: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, 11: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