PDA

View Full Version : نمایش دو تیبل در یک کوئری



iran400
شنبه 14 مرداد 1385, 13:06 عصر
سلام
دوتا تیبل دارم با فیلم‌های مشابه به هم و البته نام‌های متفاوت

حالا می‌خواهم با یک کوئری اطلاعات دوتا جدول را البته زیر هم دریافت کنم.
select * from news where id<800 and id>250 order by id desc

select * from paper where Pid<700 and id>5000 order by id desc


ممنون می‌شوم راهنمایی کنید

سنبله کار
شنبه 14 مرداد 1385, 14:03 عصر
از طریق table function می توانید

CREATE FUNCTION "Function"()
RETURNS @table_variable TABLE (column1 datatype, column2 datatype)
AS
BEGIN
INSERT INTO @table_variable select * from news where id<800 and id>250 order by id desc
INSERT INTO @table_variable select * from paper where Pid<700 and id>5000 order by id desc
RETURN
END


ضمنا column و datatype متناسب با خروجی تعریف می شود

سنبله کار
یک شنبه 15 مرداد 1385, 08:07 صبح
یک نگاهی هم به اینجا بکنند .
http://www.barnamenevis.org/forum/showthread.php?t=50086

iran400
جمعه 20 مرداد 1385, 00:24 صبح
سلام
با تشکر از راهنمایی شما
بسیار کمک کردید و کارم راه افتاد

سنبله کار
شنبه 21 مرداد 1385, 13:32 عصر
خواهش می کنم
موفق باشید
جالبه بدونید کد default که من ازش براتون استفاده کردم در اکسس پروجکت به عنوان scalar table funcion اومده بود .

hmm
شنبه 21 مرداد 1385, 14:58 عصر
اصولا union برای اینچنین مواقعی خلق شده

odiseh
یک شنبه 22 مرداد 1385, 10:24 صبح
سلام
البته برای این مساله راه های زیادی هست ولی به نظر من هم union بهتر از table-valued function است چون سرعت اجرای کوئری بالاتر می باشد.

iran400
دوشنبه 23 مرداد 1385, 13:29 عصر
سلام
البته برای این مساله راه های زیادی هست ولی به نظر من هم union بهتر از table-valued function است چون سرعت اجرای کوئری بالاتر می باشد.

سلام
در صورت امکان یک مثال بزنید

reza_rad
دوشنبه 23 مرداد 1385, 13:39 عصر
مثال:


select * from news where id<800 and id>250 order by id desc
union
select * from paper where Pid<700 and id>5000 order by id desc

sarami
سه شنبه 24 مرداد 1385, 08:24 صبح
select * from news where id<800 and id>250
union
select * from paper where Pid<700 and id>5000 order by id desc

odiseh
سه شنبه 24 مرداد 1385, 15:27 عصر
سلام
با تشکر از پاسخهای خوبی که دوستان در مورد union داده اند، من هم دو نکته کوچیک رو عنوان می کنم::
یادمان باشد که برای اجرای یه دستور از نوع union باید
اولا تعداد فیلدها در همه subQuery هایی که با هم union می کنیم یکسان باشد.
ثانیا اسامی فیلدها (alias) اون ها هم باید با هم یکسان باشد.

مثال::
select 1 as TypeCode, Name, Family From dbo.Personnel Where EduCode > 0
union
select 0 as TypeCode, ExtName as Name, ExtFamily as Family From dbo.ExtPersonnel Where EduCode = 0

سنبله کار
چهارشنبه 25 مرداد 1385, 09:39 صبح
اما به نظر می رسه یک مشکلی هست لطفا راهنمایی کنید .
در union وقتی مقادیر دو رکورد از دو جدول یکسان باشد فقط یک بار رکورد دیده می شود .
ضمنا اطلاعات جدول دوم زیر جدول اول قرار نمی گیرد بلکه بر اساس فیلد اول (ID) مرتب می شود .
که table function چینین کاری رو نمی کنه و داده ها رو بدون دستکاری ارائه میده .

reza_rad
چهارشنبه 25 مرداد 1385, 09:44 صبح
از union all استفاده کن

iran400
پنج شنبه 02 شهریور 1385, 14:13 عصر
سلام
با تشکر از reza_rad و saram

همانطور که آقای saram گفتند گزینه order by رو نمی‌شه برای هر تیبل جدا در نظر گرفت و فقط روی نتیجه دو تیبل اعمال می‌شود.

با تشکر از شما

AminSobati
پنج شنبه 02 شهریور 1385, 14:26 عصر
سلام
با تشکر از پاسخهای خوبی که دوستان در مورد union داده اند، من هم دو نکته کوچیک رو عنوان می کنم::
یادمان باشد که برای اجرای یه دستور از نوع union باید
اولا تعداد فیلدها در همه subQuery هایی که با هم union می کنیم یکسان باشد.
ثانیا اسامی فیلدها (alias) اون ها هم باید با هم یکسان باشد.

مثال::
select 1 as TypeCode, Name, Family From dbo.Personnel Where EduCode > 0
union
select 0 as TypeCode, ExtName as Name, ExtFamily as Family From dbo.ExtPersonnel Where EduCode = 0
شما میتونین در Query دوم ( و بعدیها...) Alias نگیرید. نام Alias از اولین Query استفاده خواهد شد.