PDA

View Full Version : جستجوی اطلاعات بصورت خاص !!!



djhooman
پنج شنبه 23 آبان 1392, 01:04 صبح
با سلام خدمت دوستان

من برای این مشکلم دنبال راه حل میگردم ... خواهشن راهنماییم کنید .

من دو تا تیبل دارم به نام های Customer و Order ( که این دو تیبل Relationship اصلا ندارند ! )

تو تیبل Customer فیلد های فوق رو دارم
1 - ID
2 - ShParvandeh
3 - Malek
توی تیبل Order هم 10 تا فیلد دارم که تعدادی از فیلد هاش عبارتند از :
1 - ShParvandeh
2 - Malek
3 - NoeDarkhast
4 - Mablagh
و ......
من میخوام بوسیله یه Select ، بیام ShParvandeh هایی که توی تیبل Order هست رو در تیبل Customer سرچ کنم و ID مربوط به ShParvandeh فوق رو در تیبل Customer بدست بیارم ...

چیزی حدود 10.000 رکورده و دونه دونه و دستی نمیشه این کارو کرد ...

مثالش هم :
تیبل Customer :
ID = 1
ShParvandeh = 12345
Malek = Hooman

ID = 2
ShParvandeh = 16475
Malek = Ali

ID = 3
ShParvandeh = 64540
Malek = Hossein


تیبل Order :
ShParvandeh = 12345
Malek = Hooman
NoeDarkhast = Tashkil
Mablagh = 500.000

ShParvandeh = 16475
Malek = Ali
NoeDarkhast = Tashkil
Mablagh = 300.000

ShParvandeh = 64540
Malek = Hossein
NoeDarkhast = Tashkil
Mablagh = 200.000

حالا میخوام بیام ShParvandeh هایی که توی تیبل Order هست ( مثلا 12345 ، 16475 ، 64540 ) رو در تیبل Customer سرچ کنم و ID مربوط به ShParvandeh فوق رو در تیبل Customer بدست بیارم ( که نتیجش میشه 1 ، 2 ، 3 )

امیدوارم منظورم و متوجه شده باشید . ممنون میشم راهنماییم کنید ...

golnaz_a
پنج شنبه 23 آبان 1392, 15:56 عصر
این Query رو اجرا کنید :

(SELECT ID,ShParvandeh FROM Customer where ShParvandeh in(SELECT ShParvandeh FROM Order

djhooman
پنج شنبه 23 آبان 1392, 23:13 عصر
این Query رو اجرا کنید :

(SELECT ID,ShParvandeh FROM Customer where ShParvandeh in(SELECT ShParvandeh FROM Order

من تو تیبل Customer ام حدود 4100 رکورد دارم
توی تیبل Order ام هم حدود 29000 تا ...
خروجی این Query حدود 4100 تا هستش ...
در حالی که منطقیش اینه که باید حدود 29000 تا باشه .
مشکل از کجاست ؟؟؟

golnaz_a
جمعه 24 آبان 1392, 12:07 عصر
اتفاقا برعکس منطقیش اینه که 4100 تا نشون بده چون شما فقط از 4100 تا از 29000 تا شماره پرونده ای که توی جدول Order داشتید در جدول Customer استفاده کردین. این Query می آید اون شماره پرونده هایی که توی Order هست و توی Customer هم وجود داشته بهتون میده ذر واقع داره درست کار میکنه.

djhooman
جمعه 24 آبان 1392, 13:46 عصر
نه دیگه
من تو تیبل Order یه فیلد دارم به نام ShParvandeh !!! ممکن است شماره پرونده 12345 توی 10 تا رکورد استفاده شده باشه ... حالا من میخوام بواسطه یه کوئری بیاد بگه ID شماره پرونده رکورد 1 = 145 و ....
یعنی تمام 29000 تا رکورد چک بشه !!!!

golnaz_a
جمعه 24 آبان 1392, 17:23 عصر
این شماره پرونده تکراری توی جدول Order تکراری هست درسته؟

djhooman
جمعه 24 آبان 1392, 18:07 عصر
بله تو جدول Order تکراریه

حمیدرضاصادقیان
جمعه 24 آبان 1392, 18:45 عصر
سلام
دوست عزیز کد نوشته شده در واقع کل رکوردهای شما رو جستجو میکنه و اونهایی رو برای شما برمیگردونه که shParvandeh اون هم در جدول Customer هست هم در جدول Order.
شما میتونید با یک Join بین این دو جدول اینکارو انجام بدید.
به طور مثال :

Select C.Id,C.ShParvandeh From Customer C
Inner Join [Order] as O
On O.ShParvandeh=C.Parvandeh


با این دستور درواقع یک ضرب دکارتی بین دو جدول ایجاد میشه و فقط رکوردهایی رو برای شما برمیگردونه که ShParvandeh اونها باهم برابر باشه و اگر ShPArvandeh در یکی از دوجدول نباشه رکورد فوق نخواهد اومد و اگر بخواهید اون رکوردها رو ببینید با تبدیل Inner Join به Full Outer Join رکوردهایی که در هریک از جداول نباشه رو نیز به شما نمایش میده.

djhooman
یک شنبه 26 آبان 1392, 07:29 صبح
ممنون از مدیر عزیز ( واقعا تشکر کافی نبود )
یه سوال دیگه

خوب بدلیل اینکه Relationship ای بین جدول order و customer نبوده ، کاربر خطا انجام میداده و بدون اینکه اطلاعاتی توی جدول customer ثبت کنه جدول order رو پر میکرده .
حالا میخوام بواسطه این join ای که انجام شده توسط این کوئری ( من کوئری رو یکم تغییر دادم که کلیه سطر های جدول و نشون بده )
SELECT C.ID, C.ShParvandeh AS Expr1, C.NoeDarkhast AS Expr2, O.*
FROM Customer AS C right JOIN
[Order] AS O ON C.NoeDarkhast = O.NoeDarkhast AND O.ShParvandeh = C.ShParvandeh

حالا فرض کنیم من جدول Customer رو اطلاعاتش رو خالی کنم .
میخوام از جدول Order ، ستون های ShParvandeh , Malek , NoeDarkhast و انتخاب کنم و بیام توی جدول Customer ، ثبت کنمش ...
یعنی این وسط یه Select از Order انجام میشه سپس این Select رو در جدول Customer اینسرت میکنه ...
این به چه صورت میشه ؟؟؟؟؟

djhooman
یک شنبه 26 آبان 1392, 07:30 صبح
علت این کاری که میخوام کنم ( حذف اطلاعات جدول Customer ) اینه که چون کاربر خطا انجام میداده و بدون اینکه اطلاعاتی توی جدول customer ثبت کنه جدول order رو پر میکرده هستش

محمد سلیم آبادی
سه شنبه 28 آبان 1392, 09:49 صبح
میخوام از جدول Order ، ستون های ShParvandeh , Malek , NoeDarkhast و انتخاب کنم و بیام توی جدول Customer ، ثبت کنمش ...
یعنی این وسط یه Select از Order انجام میشه سپس این Select رو در جدول Customer اینسرت میکنه ...
این به چه صورت میشه ؟؟؟؟؟ دو سوال اساسی اینجا مطرح هست:


ستون NoeDarkhast در جدول Customer وجود ندارد؛ پس چگونه است که میخواهید مقداری برای آن در نظر بگیرید؟
چرا در جدول Orders از کلید اولیه جدول Customer استفاده نشده است؟

ابتدا اجازه بدین به سوالتان پاسخ داده سپس یکمی به جامعیت و نرمالسازی بپردازیم.

TRUNCATE TABLE Customer;
Go
INSERT INTO Customer(ShParvandeh, Malek)
SELECT DISTINCT ShParvande, Malek
FROM Order;
GO

نرمالسازی و جامعیت داده ها:


Go
ALTER TABLE Customer
ALTER COLUMN ID int NOT NULL
Go
ALTER TABLE Customer
ADD CONSTRAINT primarykey
PRIMARY KEY (ID);
Go
ALTER TABLE Order
ADD CusID INT
CONSTRAINT foreignkey
REFERENCES Customer(ID)