PDA

View Full Version : سوال: يك Select براي 2 جدول ، بدون سطر تكراري



merlin_vista
سه شنبه 22 مرداد 1387, 13:57 عصر
سلام :
آقا من دوتا جدول دارم با نام هاي مختلف Tbl_user و Tbl_NewsLater كه اين دوجدول فيلد هاي متفاوتي دارند . ولي دو فيلد يكسان دارند . كه يكيش Name , Email هست .

حالا من ميخواهم اطلاعات اين دو جدول را به دستور Select بكشم بيرون و در برنامه ام به صورت يه رشته در بيارم . ولي اين اطلاعات بايد با چند تا شرط به :

1 - اگر يك ايميل مشابه در هر دو جدول وجود داشته باشه فقط يكي از آنها را بياره بيرون .

2 - در جدول Tbl_user ركورد هاي كه فيلد NewsLater_send آنها برابر True هست بكشه بيرون همين .

با تشكر :قلب:

Amir_Safideh
سه شنبه 22 مرداد 1387, 17:28 عصر
عموما برای اینکه از دو جدول بشه گزارش گرفت یا باید بر اساس یک یا چند فیلد بین جداول ارتباط وجود داشته باشه یا اینکه اون دو جدول رو با دستور Union به هم ضمیمه کرد که همین دستور زمانی به کار میاد که فیلدهای دو جدول در دستور سلکت با هم متناظر باشن .

SELECT Email
FROM Tbl_User
WHERE Tbl_User.NewsLater_Send = 1
UNION
SELECT [Name]
FROM Tbl_NewsLater
WHERE [Name] NOT IN(SELECT Email FROM Tbl_User)
این جواب بر فرض این بود که بین جداول شما ارتباطی وجود نداشته باشه و بخواهید از دستور UNION استفاده کنید . اگر ارتباط خاصی بین جداول شما وجود داشته باشه باز هم میتونید از کد بالا با کمی تغییر استفاده کنید .
--------------
موفق باشید .

رضا جاسبی
چهارشنبه 23 مرداد 1387, 01:04 صبح
عموما برای اینکه از دو جدول بشه گزارش گرفت یا باید بر اساس یک یا چند فیلد بین جداول ارتباط وجود داشته باشه یا اینکه اون دو جدول رو با دستور Union به هم ضمیمه کرد که همین دستور زمانی به کار میاد که فیلدهای دو جدول در دستور سلکت با هم متناظر باشن .

SELECT Email
FROM Tbl_User
WHERE Tbl_User.NewsLater_Send = 1
UNION
SELECT [Name]
FROM Tbl_NewsLater
WHERE [Name] NOT IN(SELECT Email FROM Tbl_User)
این جواب بر فرض این بود که بین جداول شما ارتباطی وجود نداشته باشه و بخواهید از دستور UNION استفاده کنید . اگر ارتباط خاصی بین جداول شما وجود داشته باشه باز هم میتونید از کد بالا با کمی تغییر استفاده کنید .
--------------
موفق باشید .

دوست عزیز این کد با کمی تغییر که نه با کلی تغییر باید کار کند. نمی دونم چرا دقت کافی بکار نبردید. شما یک Email رو با Name با هم Union کردید. حاصل (اگر ایراد نگیره و Type ها یکی باشند) میشه یک ستون شامل ایمیلها در TBL_User و نامها از Tbl_NewsLater البته نامها به شرطی که در لیست ایمیلهای جدول TBL_User نباشند. من اصلا هیچ منطقی در این کوئری نمی بینم. شرمنده.
اما به هر حال درستش اینه:



Select Name , Email from Tbl_user where Tbl_User.NewsLater_Send = 1
Union
Select Name , Email From Tbl_NewsLater where Email Not in (Select email from tbl_user)

Amir_Safideh
چهارشنبه 23 مرداد 1387, 09:07 صبح
دوست عزیز من اینجوری متوجه شدم که فیلد Name و Email در هر دو جدول وجود ندارن بلکه هر کدوم از اونها در یک جدولند ولی محتوای اونها یکی هستش یعنی هر دوی اونها در دو جدول مختلف آدرس ایمیل رو ذخیره میکنند . نه اینکه هر دوی اونها در هر دو جدول وجود داشته باشن . البته شاید من درست متوجه توضیحات دوستمون نشدم .

رضا جاسبی
چهارشنبه 23 مرداد 1387, 22:21 عصر
همین که شما لطف می کنی و جواب می دی جای تشکر داره. من هم فکر می کنم بهتره دوستمون منظورش رو واضحتر بگه. اما حدس می زنم که با توجه به اینکه گفتند : "ولي دو فيلد يكسان دارند . كه يكيش Name , Email هست ." دو تا فیلد Name و Email در هر دو جدول هستند.
به هر حال باز هم از شما تشکر می کنم و عذر می خوام.

رضا جاسبی
جمعه 25 مرداد 1387, 00:09 صبح
مرلین عزیز از تشکرتون ممنونم. اما میشه خواهش کنم در مورد سوالتون از من و امیر رفع ابهام کنید؟

merlin_vista
جمعه 25 مرداد 1387, 09:13 صبح
بله . چيزي كه من ميخواستم دقيقاً همين هست كه Amir_Safideh (http://barnamenevis.org/forum/member.php?u=50856) گفتند :‌

دوست عزیز من اینجوری متوجه شدم که فیلد Name و Email در هر دو جدول وجود ندارن بلکه هر کدوم از اونها در یک جدولند ولی محتوای اونها یکی هستش یعنی هر دوی اونها در دو جدول مختلف آدرس ایمیل رو ذخیره میکنند . نه اینکه هر دوی اونها در هر دو جدول وجود داشته باشن . البته شاید من درست متوجه توضیحات دوستمون نشدم .

من هم كد را با كمك شما دوستان خوب اينجوري نوشتم .

ALTER PROCEDURE [dbo].[NewsLlater_Select_user_all]
(
@chk_newslater bit,
@f_StateReg bit,
@f_StateDelete bit
)
AS
select email,username,chk_newslater from tbl_user
where chk_newslater=@chk_newslater and chk_status='true'
union
select f_Email as email,f_Name as username,f_StateReg as chk_newslater from tbl_newsletter
where ( f_Email Not in (Select email from tbl_user)) and tbl_newsletter.f_StateReg=@f_StateReg and tbl_newsletter.f_StateDelete=@f_StateDelete