View Full Version : ادغام دو جدول با شرايط خواص
ebrahimv
دوشنبه 20 تیر 1390, 15:43 عصر
سلام
من دو جدول به صورت زير دارم
72312
72313
حال ميخواهم با استفاده از اين دو جدول نمايش زير را درست كنم
72314
چه جوري اين كار رو بكنم؟
یوسف زالی
دوشنبه 20 تیر 1390, 23:34 عصر
سلام.
شما باید اول ساختار جدول موقتی را درست شبیه خروجی تولید کنید:
select Melk, CAST('' as varchar(500)) Malekin, Masahat
into #T
from JadvaleMelk
بعد در یک حلقه بیایید و Update بنویسید.
پس از Select از جدول موقتی هم آنرا Drop کنید تا دچار عواقب بعدی نشوید.
ebrahimv
سه شنبه 21 تیر 1390, 11:55 صبح
ميشه بيشتر توضيح بديد نفهميدم
یوسف زالی
سه شنبه 21 تیر 1390, 21:25 عصر
ببینید اول از همه یک ID به جدول مالکین اضافه کنید.
تو این مثال دو جدول رو به این شکل ترکیب کردم:
declare @JadvaleMelk table(CodeMelk int, Masahat int)
declare @JadvaleMalekin table(ID int, CodeMelk int, Malek varchar(100))
insert into @JadvaleMelk
values(1, 180),(2, 200)
insert into @JadvaleMalekin
values(1, 1,'hasan'),(2, 1,'ali'),(3, 2,'reza'),(4, 2,'mohammad'),(5, 1,'ebrahim')
select CodeMelk,CAST(''as varchar(4000)) Malekin, Masahat
into #T
from @JadvaleMelk
declare @x int
set @x = 0
while @x is not null
begin
set @x =(select top 1 ID from @JadvaleMalekin where ID > @x)
update #T
set Malekin += Malek +', '
from @JadvaleMalekin A
where #T.CodeMelk = A.CodeMelk and ID = @x
end
select*
from #T
drop table #T
نتیجه:
1 hasan, ali, ebrahim, 180
2 reza, mohammad, 200
محمد سلیم آبادی
پنج شنبه 23 تیر 1390, 06:06 صبح
چرا این روش رو به کاربر پیشنهاد میکنید؟
چه مزایایی نسبت به روش های دیگه داره؟ حتی استفاده از udf که یک روش غیر مجموعه گراست حداقل بسیار کوتاه تر و خواناتر هست.
شما باید اول ساختار جدول موقتی را درست شبیه خروجی تولید کنیداین جمله چه معنایی میتونه داشته باشه. یعنی اینکه این تنها روشی هست که میشه به خروجی رسید یا اینکه بر اساس راه حلی که بلد هستی باید این اتفاق بی افته؟
ebrahimv
پنج شنبه 23 تیر 1390, 10:00 صبح
چرا این روش رو به کاربر پیشنهاد میکنید؟
چه مزایایی نسبت به روش های دیگه داره؟ حتی استفاده از udf که یک روش غیر مجموعه گراست حداقل بسیار کوتاه تر و خواناتر هست.
این جمله چه معنایی میتونه داشته باشه. یعنی اینکه این تنها روشی هست که میشه به خروجی رسید یا اینکه بر اساس راه حلی که بلد هستی باید این اتفاق بی افته؟
دوست عزيز اگر روش بهتري هست بگيد؟
ebrahimv
پنج شنبه 23 تیر 1390, 12:13 عصر
تحليلم درسته
هر ملكي چندين مالك داره
برا اين مدل نمايش دادن هم دليل دارم
یوسف زالی
پنج شنبه 23 تیر 1390, 12:21 عصر
عزیزان طبق صورت سوال باید جواب یدیم!
درسته که جداول بهینه نیستند.
اما با صورت جاری سوال یکی از راه حلها این بود.
آقای سلیم ، بنده همین راه حل به ذهنم رسید.
بهتر نیست اگر راه بهتری داشتید می گفتید؟ :چشمک:
استفاده از UFD ها هم تا جایی که دانسته های ناقص بنده کفاف می ده سربار تولید می کنه و برای هر فراخوانی یک Session جدا باید باز شه برای SQL.
به نظرم بهتر اومد که از روش داینامیک استفاده بشه.
اگر شما روش بهتر - سریعتر - کوتاهتر - خواناتر یا بهینه تری دارید خب بگذارید ما هم یاد بگیریم.
اون جمله هم از روز روشن تره!
تنها روشیه که بلدم!:قهقهه:
ebrahimv
پنج شنبه 23 تیر 1390, 15:45 عصر
من دو جدول دارم اون يكي يك نمايش هست
محمد سلیم آبادی
جمعه 24 تیر 1390, 05:45 صبح
در 2000 روشی که دیده شده کاربرد بیشتری داشته UDF بوده که توسط assignment select کار میکرد. گرچه udf بهینه نمیشه ولی حداقل، کوئری که برپایه udf نوشته میشه داخل VIEW قابل بکارگیری است ولی روش های داینامیک در ویو بکارگیری نمی تونند بشن.
و از طرفی اگه حداکثر تعداد مالک مثلا محدود به 10 بود میشه توسط کوئری های استاندارد و set-based این کار رو انجام داد. ولی در کل در نسخه ی 2005 به بعد یک روش معرفی شد که استفاده ی جهانی پیدا کرد. من بهش در تاپیک زیر اشاره کردم. نمی دونم چرا توجه ای نشد.
http://barnamenevis.org/showthread.php?293981-%D9%86%D9%85%D8%A7%DB%8C%D8%B4-Row%D9%87%D8%A7%DB%8C-%DB%8C%DA%A9-Query-%D8%AF%D8%B1-%DA%A9%D9%86%D8%A7%D8%B1-%D9%87%D9%85
منظورم این کوئری هست:
--Using CROSS APPLY
SELECT S.student_name, COALESCE(LEFT(D.list, LEN(D.list)-1), '') AS course_list
FROM Students AS S
CROSS APPLY (SELECT C.course_name + ', '
FROM StudentCourse SC
INNER JOIN Courses C
ON SC.course_nbr = C.course_nbr
WHERE SC.student_nbr = S.student_nbr
ORDER BY C.course_name ASC
FOR XML PATH('')) D(list)
ORDER BY student_name;
یوسف زالی
جمعه 24 تیر 1390, 06:20 صبح
علتش اینه که این دستور فقط در 2005 کار میکنه
در 2008 به این صورت در میاد:
مثال:
<Osn>90516</Osn><Osn>90494</Osn><Osn>90701</Osn>
محمد سلیم آبادی
جمعه 24 تیر 1390, 06:24 صبح
من تو 2008 هم این روش رو استفاده میکنم و مشکلی بوجود نیومده تا حالا. باید دید کوئری که این خروجی رو تولید کرده چی بوده. تا بشه نظر داد.
یوسف زالی
جمعه 24 تیر 1390, 07:09 صبح
یک نمونه براتون میگذارم:
72468
به نظر نمیاد که استاندارد باشه.
فکر می کنم یه جورایی استفاده اتفاقی پیدا کرده.
خب نباید هم بهش اعتماد کرد.
مشخصات میزبان:
Microsoft SQL Server Management Studio 10.0.1600.22 ((SQL_PreRelease).080709-1414 )
Microsoft MSXML 3.0 4.0 5.0 6.0
Operating System 6.1.7600
Win7
محمد سلیم آبادی
یک شنبه 13 مرداد 1392, 07:52 صبح
طولانی ترین پاسخ قرن. دو سال بعد...
به نظر نمیاد که استاندارد باشه.
فکر می کنم یه جورایی استفاده اتفاقی پیدا کرده.
خب نباید هم بهش اعتماد کرد.نیاز هست که داده های عددی را به رشته ای تبدیل کنید. چیزی مشابه این:
declare @t table(i int) insert @t values (1),(2),(3),(4)
declare @s varchar(10)=''
set @s=
(
select cast(i as varchar(10))
from @t
for xml path('')
)
select @s
اینجا را هم ببینید:
http://puresql.blogsky.com/1392/05/13/post-13/%D8%A7%D9%84%D8%AD%D8%A7%D9%82-%D8%B3%D8%B7%D8%B1-%D9%87%D8%A7-%D8%AA%D9%88%D8%B3%D8%B7-%D8%A7%D8%AC%D8%B1%D8%A7%DB%8C-%D9%85%DA%A9%D8%B1%D8%B1-%D8%AF%D8%B3%D8%AA%D9%88%D8%B1-update
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.