PDA

View Full Version : مشكل در يك دستور sql



gm.sara
دوشنبه 03 فروردین 1388, 20:52 عصر
سلام
من يه دستور sql مي خوام بنويسم به اين صورت كه : در ديتابيس من دو تا فيلد به نام city و city_N هست، اطلاعات داخل ديتابيس به صورت است كه اگر city با city_N ركوردي ايجاد كرده باشد يعني يه ركورد داريم تهران(city)- اصفهان(city_n) بايد ركوردي هم در ديتابيس وجود داشته باشد به اين صورت كه اصفهان(city)- تهران(city_n)
حالا من مي خواهم دستور sqlي بنويسم كه اگر اين ركوردي را كه اين رابطه را ندارند نشان بدهد
دستوري كه اين رابطه را نشان دهد من به صورت زير نوشتم:

slect b.* from tblcity as a,tblcity as b where b.city=a.city_n and b.city_n=a.city
اين دستور تمام ركوردهايي را كه اين رابطه را دارند را نشان مي دهد ولي من چيزي مي خواهم كه ركوردي را كه اين شرط را ندارد را نشان دهد اگر به جاي = هم <> بگذارم زمان خيلي زيادي طول مي كشد كه انجام شود، در اصل انجام نمي شود. در اصل ركوردهايي را مي خواهم كه جز اين دستور نباشد از كد زير استفاده كردم ولي خروجي نداد:

select * from tblcity where not exists(slect b.* from tblcity as a,tblcity as b where b.city=a.city_n and b.city_n=a.city)
مگه اين دستور نمي گه ركوردهايي را بيار كه داخل اين select نباشند؟
لطفا راهنمايي كنيد كه اشكال كار از كجاست؟:متفکر:

siavash_realy
دوشنبه 03 فروردین 1388, 21:40 عصر
سلام شايد اين دستور كمك كنه ، نتيجه اين select رديف هايي رو بر ميگردونه كه معادل برعكس ندارند، فرض رو بر اين گرفتم كه اسم جدول اطلاعاتت Table1 هستش :
SELECT A,B,Count(C) AS 'Check' FROM
(SELECT City AS A, City_N AS B , '1' AS C FROM Table1 AS FirstTbl
UNION
SELECT City_N AS A, City AS B , '2' AS C FROM Table1 AS SecondTbl) AS SourceTable
GROUP BY A, B
HAVING (Count(C)=1)

siavash_realy
دوشنبه 03 فروردین 1388, 21:45 عصر
مثلا اگر جدول اطلاعاتت شامل اطلاعات زير باشه :
City_N City
تهران اصفهان
اصفهان تهران
شيراز تهران
اهواز تهران
تهران اهواز
اصفهان تهران
نتيجه اون Select بهت اين رو بر ميگردونه :
Check A B
شيراز تهران 1
تهران شيراز 1

البته تو نتيجه بهت يك ركورد اضافه و بلامصرف هم بر ميگردونه كه همون ركورد دوم (تهران-شيراز) باشه ، ميتوني نتيجه رو با مقداري كه واسه City و City_N ميگيري فيلتر كني و اگر نتيجه فيلتر ركوردي بود يعني اينكه اون شهر تو معادل در جدول اطلاعاتت نداره

ahmadr
دوشنبه 03 فروردین 1388, 23:33 عصر
ببین این کارتو راه می اندازه :


select city,city_n from tblcity where city not in (select city_n from tblcity ) and city_n not in (select city from tblcity )

gm.sara
دوشنبه 03 فروردین 1388, 23:55 عصر
ببین این کارتو راه می اندازه :


select city,city_n from tblcity where city not in (select city_n from tblcity ) and city_n not in (select city from tblcity )


ممنون از لطف شما ولي اين دستور هم ركوردي به من برنمي گردونه!

gm.sara
سه شنبه 04 فروردین 1388, 00:00 صبح
مثلا اگر جدول اطلاعاتت شامل اطلاعات زير باشه :
City_N City
تهران اصفهان
اصفهان تهران
شيراز تهران
اهواز تهران
تهران اهواز
اصفهان تهران
نتيجه اون Select بهت اين رو بر ميگردونه :
Check A B
شيراز تهران 1
تهران شيراز 1

البته تو نتيجه بهت يك ركورد اضافه و بلامصرف هم بر ميگردونه كه همون ركورد دوم (تهران-شيراز) باشه ، ميتوني نتيجه رو با مقداري كه واسه City و City_N ميگيري فيلتر كني و اگر نتيجه فيلتر ركوردي بود يعني اينكه اون شهر تو معادل در جدول اطلاعاتت نداره

از شما دوست عزيز هم ممنون
ولي همين ركورد اضافي براي من مشكل ساز مي شه من چيزي را از ورودي نمي گيرم كه بخوام روش فيلتر كنم قراره از اين خروجي استفاده كنم. وقتي تعداد ركوردهاي يكطرفه زيادتر بشه مشكل سازتر مي شه

راستي ما از اپراتور minus نمي تونيم استفاده كنيم؟ sql2000 قبولش نمي كنه؟
در ضمن شما نمي دونيد كه اشكال كد خودم چي هست؟

siavash_realy
سه شنبه 04 فروردین 1388, 02:26 صبح
راستش رو بخواي فرصت نكردم منطق دستورت رو كامل چك كنم ولي يه راه ديگه واست مينويسم كه مشكلت رو كامل حل كنه و ركورد اضافه هم برنگردونه ، فكر كنم راحت تر هم باشه :
SELECT Table1.City, Table1.City_N
FROM Table1 AS Sync RIGHT OUTER JOIN Table1 ON Sync.City_N = Table1.City AND Sync.City = Table1.City_N
WHERE (Sync.City_N IS NULL) AND (Sync.City IS NULL)

siavash_realy
سه شنبه 04 فروردین 1388, 02:30 صبح
اما سرعتش رو با حجم داده بالا بايد چك كني (البته فكر نكنم مشكل خاصي بخوره ولي كار از محكم كاري عيب نميكنه) درضمن من فرض رو بر اين گرفتم كه Table1 اسم همون جدوليه كه اطلاعاتت توشه، ميتوني Table1 رو با اسم اصلي Table ات جايگزين كني ولي باقيش نيازي به دست زدن نبايد داشته باشه

ahmadr
سه شنبه 04 فروردین 1388, 08:49 صبح
اگر امکان دارد جدول رو به یک بانک خالی(Access) منتقل کنید و اینجا بگذارید تا زودتر به جواب برسیم.

gm.sara
سه شنبه 04 فروردین 1388, 11:18 صبح
راستش رو بخواي فرصت نكردم منطق دستورت رو كامل چك كنم ولي يه راه ديگه واست مينويسم كه مشكلت رو كامل حل كنه و ركورد اضافه هم برنگردونه ، فكر كنم راحت تر هم باشه :
SELECT Table1.City, Table1.City_N
FROM Table1 AS Sync RIGHT OUTER JOIN Table1 ON Sync.City_N = Table1.City AND Sync.City = Table1.City_N
WHERE (Sync.City_N IS NULL) AND (Sync.City IS NULL)

ممنون از شما کارم را راه انداخت
اگر ممکنه در مورد شیوه ای که استفاده کردید هم کمی توضیح بدید.
بازم ممنون

siavash_realy
سه شنبه 04 فروردین 1388, 14:22 عصر
من اومدم بين جدول تو با خود جدوت يك join زدم به جدول اولت اسم table1 رو اختصاص دادم كه همون اسم اصلي جدولت باشه و به جدول دوم كه مساوي همون جدول اوله اسم Sync رو تخصيص دادم و به شكل كراس بين دو تا جدول join رو برقرار كردم يعني گفتم Table1.City=Sync.City_N و Table1.City_N = Sync.City و در دستور Select ام گفتم تمام ركوردهاي Table1 را برگردونه و ركوردهايي رو هم كه در جدول Sync وجود داره رو درصورت معادل داشتن برگردونه، و اگر تو نتيجه Select مقدار دو فيلد Sync.City و Sync.City_N مساوي Null باشه يعني اون ركوردها داراي معادل ضربدري (برعكس) نبودن و اگر هم نتيجه غير از Null بشه يعني اون ركوردها معادل برعكس دارن و من هم بنا به نياز شما در انتهاي دستور Select نتيجه رو براساس مقدار Null فيلتر كردم تا فقط ركوردهايي رو بهت نمايش بده كه معادل برعكس ندارند - ميدونم خيلي بد توضيح دادم واقعا ببخشيد :(

gm.sara
سه شنبه 04 فروردین 1388, 20:30 عصر
ممنون دوست عزیز
توضیحتون را تقریبا متوجه شدم.البته صبح جواب داد ولی در بینش رکوردهایی را هم می آورد که دوطرفه تعریف شده است. نمی دونم مشکل از کجاست منطقا که نباید مشکلی باشد ولی هنوز مشکل داره. تمام یکطرفه ها را می آورد ولی بعضی از دوطرفه ها را هم در خروجی می آورد(البته نه همشون را بعضی ها را نمی دانم این بعضی را از کجا می آره)؟:متفکر:

siavash_realy
سه شنبه 04 فروردین 1388, 21:44 عصر
احتمالا تو متن ديتاي اون بعضي ها كلمه ي وجود داره !!! اين مشكل خيلي شايع هستش چون حرف ي در يونيكد فارسي و عربي با هم تفاوت دارن ولي جفتشون ي خونده ميشن !!! احتمالا اون دوطرفه ها توي متن نوشته هاشون حرف ي رو دارن با دوتا يونيكد متفاوت كه اين باعث ميشه اس كيو ال بين اونها تفاوت قائل شه ! اگر ميشه اون ركوردهايي رو كه اين مشكل رو دارند متنشون رو برام بنويس . مرسي

gm.sara
چهارشنبه 05 فروردین 1388, 10:30 صبح
ولی متن ها به صورت انگلیسی هست!

siavash_realy
پنج شنبه 06 فروردین 1388, 12:55 عصر
براتون امكان داره كه اطلاعاتتون رو در يك فايل اكسس يا اكسل يا همون mdf برام بگذاريد تا چكش كنم ؟