ورود

View Full Version : سه relation از یک table به table ی دیگر و چگونگی نوشتن دستور select



piroozman
شنبه 21 شهریور 1388, 23:22 عصر
فرض کنیم دو جدول با نامهای زیر داریم:
1. Table_1 دارای دوفیلد id و name که کلید اصلی آن id است.
2. Table_2 دارای یک فیلد با نام id_1 و id_2 و id_3
فیلدهای id_1 الی id_3 موجود در table_2 کلید خارجی هستند و کلید اصلی آنها همان کلید اصلی در جدول table_1 با نام id است.
حال فرض کنیم Table_1 دارای سه رکورد به شرح ذیل است:
رکورد اول: id=1,name=ali
رکورد دوم:id=2, name=rasol
رکورد سوم:id=3,name=mohammad
و table_2 دارای یک رکود به شرح ذیل است:
Id_1 = 1, id_2 = 2, id_3 = 3
همانطور که متوجه شدید از جدول table_1 سه relation به جدول table_2 وجود دارد.
حال سئوال اینجاست که چگونه می توانم دستور select ی بنویسم که با استفاده از id های موجود در table_2 مقادیر name معادل آنها را از جدول table_1 استخراج کنم به طوری که نتیجه زیر از select حاصل شودک
جدول حاصل از select می خواهم رکورد زیر باشد:
ali , rasol, mohammad

محمد سلیم آبادی
شنبه 21 شهریور 1388, 23:32 عصر
استفاده از SubQuery یک روش است، این رو امتحان کنید:




SELECT [name 1]=(select name from table_1 t1 where t1.id=t2.id_1)
,[name 2]=(select name from table_1 t1 where t1.id=t2.id_2)
,[name 3]=(select name from table_1 t1 where t1.id=t2.id_3)
FROM table_2 t2

piroozman
سه شنبه 24 شهریور 1388, 14:33 عصر
استفاده از SubQuery یک روش است، این رو امتحان کنید:
. . .
ضمن تقدیر و تشکر از جنابعالی به پاسخی به این تاپیک دادید. مسئله دیگری پیش آمده است. فرض کنیم به جای استفاه از نام ستونها از مقدار جهت یافتن مقدارهای مورد نظر استفاده کنیم یعنی به شکل زیر:

SELECT [name 1]=(select name from table_1 t1 where t1.id=1)
,[name 2]=(select name from table_1 t1 where t1.id=2)
,[name 3]=(select name from table_1 t1 where t1.id=3)
FROM table_2 t2

و اگر جدول t2 دارای دو رکورد باشد که اصلا مشابه هم نباشند، دستور فوق به جای این که رکوردی که دارای مقادیر 1و2و3 است برگرداند همین رکورد را دو بار بر می گرداند. یعنی خود داده ها را به تعداد رکوردهای جدول t2 تکرار می کند من برای حل این مشکل از کلمه کلیدی
distinct استفاده کرده ام. ولی می خواستم بدونم چرا این اتفاق می افته و چطوری می تونم بدون استفاده از کلمه distinct به هدفم که بازیابی فقط آن رکورد است برسم.

piroozman
سه شنبه 24 شهریور 1388, 14:39 عصر
استفاده از SubQuery یک روش است، این رو امتحان کنید:

ضمن تقدیر و تشکر از جنابعالی حال سئوال دیگری برای بنده مطرح شد. فرض کنیم به جای استفاده از نام ستونها در قسمت شرط، از داده های اصلی جهت جستجو استفاده کنیم. به طور مثل



SELECT [name 1]=(select name from table_1 t1 where t1.id=1)
,[name 2]=(select name from table_1 t1 where t1.id=2)
,[name 3]=(select name from table_1 t1 where t1.id=3)
FROM table_2 t2

اما با این کار بنده به جای یک رکورد به تعداد رکوردهای جدول t2 رکوردهای مشابه خواهم داشت برای رفع این مشکل از کلمه کلیدی distinct استفاده کردم. حالا آیا این روش دست است یا خیر و اگر روش بهتری وجود دارد چیست و این که چرا باید دستور فوق به تعداد رکوردهای جدول t2 رکورد بر می گرداند؟

محمد سلیم آبادی
سه شنبه 24 شهریور 1388, 17:48 عصر
چند حالت وجود دارد:
از طرفی می گویید جدول دوم یک سطر دارد از طرفی می گویید که در خروجی چندین سطر تکراری به نمایش در میاید، اگر هدفتان بدست آوردن اسامی سه سطر مورد نظر از جدول اول باشد با یک دستور select بدون from این کار امکان پذیر است، کافی است در query آخری که خود پست کردید ماده ی from را حذف کنید!

در واقع ما می توانیم با کمک ماده from به تعداد سطر موجود در table source یک سطری را بر گردانیم به مثال زیر توجه کنید


select [constant]='repeat'

select [constant]='repeat'
from table_2

AminSobati
سه شنبه 24 شهریور 1388, 22:01 عصر
declare @t1 table(c1 int primary key, c2 nvarchar(20))
declare @t2 table(id1 int, id2 int, id3 int)
insert @t1 values(1,'A')
insert @t1 values(2,'B')
insert @t1 values(3,'C')
insert @t2 values(1,2,3)

select
(select c2 from @t1 where c1=id1),
(select c2 from @t1 where c1=id2),
(select c2 from @t1 where c1=id3)
from @t2

select t_a.c2, t_b.c2, t_c.c2 from @t2 t2
left join @t1 t_a
on t2.id1=t_a.c1
left join @t1 t_b
on t2.id2=t_b.c1
left join @t1 t_c
on t2.id3=t_c.c1

محمد سلیم آبادی
چهارشنبه 25 شهریور 1388, 01:45 صبح
declare @t1 table(c1 int primary key, c2 nvarchar(20))
declare @t2 table(id1 int, id2 int, id3 int)
insert @t1 values(1,'A')
insert @t1 values(2,'B')
insert @t1 values(3,'C')
insert @t2 values(1,2,3)

select
(select c2 from @t1 where c1=id1),
(select c2 from @t1 where c1=id2),
(select c2 from @t1 where c1=id3)
from @t2

select t_a.c2, t_b.c2, t_c.c2 from @t2 t2
left join @t1 t_a
on t2.id1=t_a.c1
left join @t1 t_b
on t2.id2=t_b.c1
left join @t1 t_c
on t2.id3=t_c.c1


راه حل برای SQL 2005/2008
:چشمک:




SELECT id1,
id2,
id3
FROM
(
SELECT Number,
c2,
id
FROM
(
SELECT *
FROM
(
SELECT id=ROW_NUMBER()
OVER(ORDER BY id1)
,*
FROM @t2
)d
) p
UNPIVOT
(
[Value] FOR [Number] IN
(id1, id2, id3)
)AS unpvt
INNER JOIN @t1 t
ON unpvt.Value=t.c1
)d
PIVOT
(
MAX(c2)
FOR [number] IN ([id1],[id2],[id3])
)piv