الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

هل أستخدم Where أم Inner Join أم ماذا في هذا الإستعلام

مغلق
بدأه hatif في 14 فبراير 2008 · 11 رد · 1,642 مشاهدة · في ADO.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

عندي خمسة جداول

جدول كتب وبه رقم الكتاب واسم الكتاب

جدول المؤلف وبه رقم المؤلف واسمه ورقم الكتاب

جدول المحقق وبه رقم المحقق واسمه ورقم الكتاب

الجداول مشتركة فيما بينها برقم الكتاب

يكون لكل كتاب مؤلف ولكن لايلزم أن يكون له محقق

قد يكون للكتاب الواحد أكثر من مؤلف

قد يكون للكتاب الواحد أكثر من محقق

بقية الجداول على نفس النمط

جربت الداتا قريد وعبارة where ولكنها تكرر السجلات بشكل غريب وجربت عبارة inner join ولكن ظهر لي خطأ

ما أريده هو اظهار اسم الكتاب وكل مؤلفيه وكل محققيه مرة واحدة والتنقل بعد ذلك بعبارة استعلام واحدة أي لايكون الاستعلام عن كل جدول منفصل عن بقية الجداول .

بحثت كثيرا في المنتدى وبقية المنتديات ولم أجد الحل ساعدوني رجاء

#2

الجدول الوسيط اسمه Mid حتوي على ال ID الخاص بكل من الكتاب و المؤلف و المحقق, طبعا كل منهم هو مفتاح اساسي من الجدول الأصلي الخاص به , و الثلاثة معا مفتاح اساسي في الجدول الوسيط , هذا هو الإستعلام الصحيح و الله أعلم ...

select BName,AName,EName
From Book,Auther,Examiner
where Mid.BID=BID and Mid.AID=AID and Mid.EID and BName = "Some value"

عليك ملاحظة أن Mid.BID هو قيمة ال ID الخاصه بالكتاب من الجدول الوسيط , و ال BID هي قيمة ال Id الخاص بالكتاب من الجدول الكتب .

ملاحظه أخرى هذه جملة (SQL) قياسية , أنا لا أعرف ADO و لكن بإمكانك تعديل هذه الجملة بحيث تلائم إحتياجك (مع ال ADO).

هذا والله أعلم

تحياتي

#3

ياريت توضح اكثر ايه اللى بيتكرر و من آى جدول منهم وكود الأستعلام علشان نقدر نقدم المساعدة

وعلى العموم أستخدم كلمة DISTINCT فى جملة الأستعلام فهى تمنع تكرار السجلات

على سبيل المثال

Str = "SELECT DISTINCT typename FROM items ORDER  BY typename ASC"

كل من فى الوجود يطلب صيداً :::: غير ان الشباك مختلفات

#4

الأخ خلدون خالد2 شكرا لك على سرعة الرد

فكرة الجدول الوسيط ممتازة ولكن فيه مشكلة وهي أن المؤلف أو المحقق قد يكون أكثر من واحد أي مثلا ثلاثة مؤلفين واثنين محققين لكتاب واحد فكيف أصمم الجدول الوسيط بناء على هذا ؟

الأخ njd شكرا لك على سرعة الرد ومشكلة كود الإستعلام أنه طويل جدا وغير مفهوم بسبب التسميات (المبتكرة) للجداول وأنا حاولت توضيح المشكلة بشكل مبسط لكي أستفيد أنا وكذلك غيري من الحل ويستطيع من يواجه مثل مشكلتي فهم الصورة بشكل سريع وتطبيق الحل على مشكلته.

أما التكرار في الإستعلام فهو على سبيل المثال إذا كان بجدول الكتب كتاب واحد وله أربعة مؤلفين وثلاثة محققين فإنه يعيد عدد 12 سجل ويكرر الكتاب 12 مرة والمؤلفين من 1 إلى 4 يكررها 3 مرات والمحققين من 1 إلى 3 يكررها 4 مرات . غريب أليس كذلك ؟

وشكرا لكم مرة أخرى .

#5
اقتباس
فكرة الجدول الوسيط ممتازة ولكن فيه مشكلة وهي أن المؤلف أو المحقق قد يكون أكثر من واحد أي مثلا ثلاثة مؤلفين واثنين محققين لكتاب واحد فكيف أصمم الجدول الوسيط بناء على هذا ؟

وجود أكثر من مؤلف أو محقق لنفس الكتاب لا يتعارض مع إستخدام الجدول الوسيط و هو من أساسيات ال Mapping لل ER Diagrame حيث أنه من الواضح أن هناك علاقه ثلاثية بين العناصر (الجداول) (entity) الثلاث , و في العلاقة الثلاثية (Ternary Relationship) يتم إحضار المفتاح الأساسي من كل جدول مشترك في هذه العلاقة و وضعه في جدول وسيط ويتم إعتبار المفاتيح الثلاثة (كل واحد على حده هو مفتاح أجنبي) ك مفتاح أساسي للجدول الأساسي , وهذا لا يمنع (يتيح) وجود اكثر من مؤلف أو محقق لنفس الكتاب .

سأعطيك مثالاً للمحتويات ا لمتوقعة للجدول الوسيط .

رقم الكتاب (BID) | رقم المؤلف (AID) | رقم المحقق (EID)

1 1 1

1 2 1

2 3 5

2 1 1

2 2 2

واضح أن الكتاب رقم 1 له أكثر من مؤلف و أكثر من محقق و كذلك الكتاب رقم 2

بالنسبة للخطأ الذي يحدث لديك هو نتيجة عدم استخدام ال

where Mid.BID=BID and Mid.AID=AID and Mid.EID

بشكل صحيح .

#6

الأخ خلدون خالد2 شكرا لك على التوضيح وسرعة الرد وبارك الله فيك

أنا فهمت الآن عمل الجدول الوسيط .

الآن مادام أن الجدول الوسيط هو الحل الصحيح لبرنامجي فهل أعمل جدول وسيط جديد من ضمن القاعدة وأضيف له البيانات عندما أقوم بإضافة البيانات لجدول الكتب والمؤلفين والمحققين تماما أم يكون ذلك عن طريق استعلام وإنشاء جدول جديد (مؤقت) عند تشغيل البرنامج .

ثم كيف ستكون عبارة الإستعلام يعني هل أستعلم عن كافة السجلات المرتبطة في الجدول الوسيط ثم أقوم بعمل استعلام ثاني بناء على الإستعلام الأول ليستخرج لي السجلات المطلوبة من جدول الكتب والمؤلفين والمحققين بعد معرفة أرقامها .

يا ليت لو تمثل لي بمثال عبارة الإستعلام كيف ستكون ولو بشكل مختصر لإن الأمور بدأت تختلط علي في عبارة الإستعلام بالذات (لي ثلاثة أيام أحوس في هذا الكود) .

وشكرا لك مرة أخرى

#7
اقتباس
فهل أعمل جدول وسيط جديد من ضمن القاعدة وأضيف له البيانات عندما أقوم بإضافة البيانات لجدول الكتب والمؤلفين والمحققين تماما

هذا ما يتوجب عليك عمله , يعني عليك انشاء الجدول من البداية , و من ثم عند استعمال قاعدة البيانات يتم إضافة العناصر إلى الجدول الوسيط .

اقتباس
ثم كيف ستكون عبارة الإستعلام يعني هل أستعلم عن كافة السجلات المرتبطة في الجدول الوسيط ثم أقوم بعمل استعلام ثاني بناء على الإستعلام الأول ليستخرج لي السجلات المطلوبة من جدول الكتب والمؤلفين والمحققين بعد معرفة أرقامها .

جملة الإستعلام التي وضعتها لك فوق تفي بالغرض بإذن الله سأعيدها هنا

select BName,AName,EName
From Book,Auther,Examiner
where Mid.BID=BID and Mid.AID=AID and Mid.EID and BName = "SQL Principles"

مثال علي ناتج هذه الجملة

 
Book Name		  |   Authers   |   Examiner 

SQLPrinciples	 | Ahmad	   |	mohamadd
SQL Principles	|Mahmoud   |	Eiad
SQL Principles	|Nabel		  |   Rami

ستكون نتائج الإستعلام بهذا الشكل تقريبا إن شاء الله , ممكن الشكل يختلف لكن نفس المضمون , والنتيجه صحيحه , لاحظ أن الكتاب له 3 مؤلفين و 3 محققين

أما بالنسبة لكيفية تطبيق ذلك في ال ADO هذا عملك أعانك الله

حياك الله أخي , أرجو أن أكون قد أفدتك .

#8

أخي خلدون خالد2 نعم لقد أفدتني كثيرا وجزاك الله خيرا

بالنسبة للكود فهل عبارة

and BName = "SQL Principles"

هل هي اختيارية أم ضرورية لعمل الكود يعني هل البحث باسم الكتاب ضروري لعبارة الإستعلام .

وشكرا لك على المساعدة أخي خلدون خالد2

#9
اقتباس
هل هي اختيارية أم ضرورية لعمل الكود يعني هل البحث باسم الكتاب ضروري لعبارة الإستعلام .

هي إختيارية و إجبارية , يعني أنك تريد أن تبحث عن معلومات كتاب بالإسم يعني تريد أن تعطيه الاسم و يعطيك معلومات الكتاب .

أما في ال ADO فسوف تقوم بإستبدالها بصيغه معينه مثلا قيمة مربع نص معين (TextBox1.Text) على سبيل المثال .

في حال لم تضع هذه الجملة فسوف يعطيك الإستعلام كل القيم الموجوده في قاعدة البيانات بدون فلتره , ولكن عند استخدامها سوف يعطيك معلومات هذا الكتاب.

يمكنك استبدالها على سبيل المثال إذا أردت البحث عن معلومات كتاب بناء على رقمه , يمكنك استبدالها في حال مثلا أردت أن تبحث عن مؤلفات مؤلف معين

لفعل ذلك يمكنك وضع

and AName = "Ahmad"

طبعا مع ملاحظة تغيير القيم المراد استخراجها في سطر ال Select

تحياتي

#10

شكرا لك أخي خلدون خالد2 على المساعدة وسرعة الرد

ولكن للأسف الكود بعد التجربة يعيد البيانات مكررة مثلما حصل لي في البداية مع داتا قريد فيو يعني يكرر اسم الكتاب بحسب عدد المؤلفين أو المحققين

ولكن قمت بحل المشكلة وهو حل صعب وثقيل عن طريق الإستعلام عن الكتاب لوحده ثم الأستعلام عن المؤلفين من جدول المؤلفين والرابط هو رقم الكتاب ثم الإستعلام عن المحققين وهكذا وعند التنقل للأمام والخلف يكون عن طريق position بالنسبة للكتاب أما المؤلفين والمحققين وغيرها من الجداول فيكون عن طريق استعلام لكل جدول على حده.

حل بايخ لكن ما في اليد من حيلة .

عموما ما قصرت وشكرا لك أخي الفاضل

#11

كما وض

كما وضحت لك سابقا النتائج سوف تكون مكرره ولكن التكرار لن يكون خاطئ , يعني تكرار طبيعي ,

بإمكانك للإستغناء عن التكرار , أن تقوم بعمل جملة استعلام على الجدول الناتج من الجملة الأولى يمكنك استخدام Distinic

#12

مشكور أخي الفاضل تعبتك معي

بالنسبة لعبارة Distinic سوف أقوم بتجربتها لأرى هل تحذف القيم المكررة فقط (يعني الخلايا المكررة) أم أنها تحذف الخلية والصف الناتج (الذي فيه الخلية) .

لأن الطريقة التي جربتها سابقا (الجدول الوسيط) ترجع صفوف مثلما قلت أنت كالآتي :

اسم الكتاب اسماء المؤلفين اسماء المحققين

الكتاب الأول المؤلف 1 المحقق 1

الكتاب الأول المؤلف2 المحقق2

الكتاب الثاني المؤلف1 المحقق1

الكتاب الثاني المؤلف2 المحقق2

فلو قامت العبارة بحذف القيم المكررة مع كامل الصف الذي فيه القيمة فسيصبح الناتج كالآتي :

اسم الكتاب اسماء المؤلفين اسماء المحققين

الكتاب الأول المؤلف 1 المحقق 1

الكتاب الثاني المؤلف1 المحقق1

وواضح أن السجلات ناقصة بسبب الفلترة وحذف المكررات .

عموما سأجرب هذه الطريقة إن شاء الله لأتأكد .

وشكرا لك أخي الكريم على مساعدتك .

هذا الموضوع مغلق.

مواضيع مشابهة