PDA

View Full Version : join دو جدول (کمک فوری)



teymoorei
سه شنبه 10 آبان 1390, 08:39 صبح
سلام
دو تا جدول دارم با یک فیلد مشترک به نام numreg ، در یک جدول اطلاعات مشتری ذخیره میشه و در یکی دیگه فیش هایی که تا حالا آورده ، در ضمن در هر دوره مشتری یک فیش میاره یعنی یک فیلد در جدول فیش ها به نام numdoreh دارن .
حالا می خوام بازدن شماره دوره ببینم در این دوره چه افرادی فیش نیاورده اند .
من این کد رو نوشتم و جواب هم درست هستش اما اسم افراد رو به تعداد دفعاتی که فیش آوردن چاپ می کنه ، ممکنه یکی 100 تا فیش آورده باشه و 100 بار اسمش چاپ میشه .
اینم کد من :
"Select numpri,numhr,namepar,tarikhpar,tarikhsah,tblregist er.family,tblregister.numreg From tblregister join tblfish2 on tblregister.numreg=tblfish2.numreg Where numdoreh != N'" & TextBox2.Text & "'"
لطفا کمک کنید .

Felony
سه شنبه 10 آبان 1390, 09:25 صبح
در ضمن در هر دوره مشتری یک فیش میاره یعنی یک فیلد در جدول فیش ها به نام numdoreh دارن .
مگه نمیگی تو هر دوره هر مشتری یک فیش میاره ؟! مگه جدول رو بر اساس نام دوره فیلتر نمیکنی ؟! خوب چند تا فیش کجا بود ؟!

در هر صورت میتونی از دستور DISTINCT استفاده کنی تا خروجی کوئریت فاقد اطلاعات تکراری باشه .

teymoorei
سه شنبه 10 آبان 1390, 11:44 صبح
ازش استفاده کردم اما بازم جواب نداد .

مگه نمیگی تو هر دوره هر مشتری یک فیش میاره ؟! مگه جدول رو بر اساس نام دوره فیلتر نمیکنی ؟! خوب چند تا فیش کجا بود ؟!

به تعداد فیش هایی که در دوره های قبل ثبت شده نشون میده .
خواهشا کمک کنید .

Felony
سه شنبه 10 آبان 1390, 12:55 عصر
تا جایی که من فهمیدم در جدول شما دوره های همنام وجود داره ( مثلا یکی برای 2 سال قبل و یکی برای 1 سال قبل و یکی برای امسال ) ؛ طبیعی هست که Select هر سه این موارد رو برگردونه ، شما باید برای هر دوره یک فیلد منحصر به فرد در نظر بگیرید ، مثلا دوره a شماره 1 ، دوره a شماره 2 و بعد در Select بگید که آخرین دوره a رو با توجه به شمارش براتون فیلتر کنه یا اینکه اگر در جدولتون فیلد ID دارید تو Select بگید مثلا اول همه دوره های a رو پیدا کنه و بعد اونی که مقدار فیلد ID ش از همه بیشتر هست رو برگردونه ( اگر فیلد تاریخ داری ، بر اساس اون هم میتونی این کار رو انجام بدی ) .

teymoorei
سه شنبه 10 آبان 1390, 13:46 عصر
نمیشه آخه باید از روی شماره عضویت هر فرد که در هردو جدول ذخیره شده پیدا بشه .
من در هر دوره یه شماره دارم اما این شماره برای همه ی افراد این دوره است .
خواهشا کمک کنید ، اساسی اعصابم رو خورد کرده .

حمیدرضاصادقیان
سه شنبه 10 آبان 1390, 14:05 عصر
سلام.
اینو تست کنید.
SELECT Family,Numreg FROM TblRegister
WHERE Numreg NOT IN(SELECT Numreg FROM Tblfish2 WHERE numdoreh=20)

Galawij
سه شنبه 10 آبان 1390, 14:20 عصر
سلام،
هر چند تحلیل این جداول شما مشکل داره، سعی کنید Query را به یک همچین حالتی بنویسید(من جداول شما را ندارم، فقط ساختار را نشان می دم):
With CTE AS(Select numpri,numhr,namepar,tarikhpar,tarikhsah,tblregist ,er.family,tblregister.numreg,numdoreh From tblregister join tblfish2 on tblregister.numreg=tblfish2.numreg)
Select * From CTE where numreg Not IN (Select numreg From CTE) AND (Select numdoreh From CTE)=@numdoreh
چون شما افرادی را می خواهید که فیش نیاورده اند، و join افرادی را می دهد که در دوره های مختلف فیش آورده اند، در نتیجه باید از Not IN استفاده کرد.

حمیدرضاصادقیان
سه شنبه 10 آبان 1390, 14:40 عصر
البته من احساس میکنم این Join رو اضافی انجام میدن فقط لیست مشتریارو میخوان که توی اون دوره فیش ندارن به همین خاطر اون کد رو نوشتم. ولی اگر به Join واقعا نیاز دارید کد پست 7 کاملتره.

teymoorei
سه شنبه 10 آبان 1390, 20:47 عصر
سلام
درست شد .:قلب::قلب:
از دستور آقای حمید رضا صادقیان استفاده کردم .
ممنونم بچه ها .