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

How to select three Foreign Key references the same table

بدأه عمرو عماد في 10 يوليو 2014 · 7 رد · 361 مشاهدة · في Microsoft Visual C#.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله وبركاته :

عندي سؤال في كتابة جملة Select للجدولين التالين :

CREATE TABLE Employees(
	ID 	        INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
	EmployeeNo 	TEXT    NOT NULL,
	EmployeeName 	TEXT    NOT NULL,
	Username 	TEXT,
	ComputerName 	TEXT,
	Job 	        TEXT,
	Department 	TEXT,
	Address 	TEXT,
	StartDate 	TEXT,
	BirthDate 	TEXT,
	Description	TEXT)
CREATE TABLE Projects     (
	ID	        INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
	ProjectNo	TEXT    NOT NULL,
	ProjectName	TEXT    NOT NULL,
	Capacity 	REAL,
	Address	       	TEXT,
	ProjectTitle	TEXT,
	DesignerID	INTEGER,
	ExecutorID      INTEGER,
	DraftmanID	INTEGER,
	MainContractor  TEXT,
	Client          TEXT,
	MainConsultant  TEXT,
	CivilConsultant TEXT,
	StartDate       TEXT,
	EndDate         TEXT,
	Description     TEXT,
	FOREIGN KEY (DesignerID) REFERENCES Employees(ID),
	FOREIGN KEY (ExecutorID) REFERENCES Employees(ID),
	FOREIGN KEY (DraftmanID) REFERENCES Employees(ID))

عندي ثلاثة حقول في جدول Projects تشير إلي جدول Employees قمت بكتابة جملة الــ SQL بهذا الشكل :

SELECT Projects.ProjectNo AS ID, Projects.ProjectName AS Name, Projects.Capacity AS [Capacity (m3/Day)], Projects.ProjectTitle AS Title,Projects.Address, Employees.EmployeeName AS [Designer], Employees.EmployeeName AS [Executor], Employees.EmployeeName AS [Draftman],Projects.MainContractor AS [Main Contractor], 
Projects.Client AS [Client/End User], Projects.MainConsultant AS [Main Consultant],Projects.CivilConsultant AS [Civil Consultant], Projects.StartDate as [Start Date], Projects.EndDate As [End Date], Projects.Description
	FROM Projects
	INNER JOIN Employees ON Projects.DesignerID = Employees.ID

فقامت بعرض الثلاث حقول الخاصة بأسماء الموظفين متشابهة فقمت بتعديل جملة الـ SQL إلي :

SELECT Projects.ProjectNo AS ID, Projects.ProjectName AS Name, Projects.Capacity AS [Capacity (m3/Day)], Projects.ProjectTitle AS Title,Projects.Address, Employees.EmployeeName AS [Designer], Employees.EmployeeName AS [Executor], Employees.EmployeeName AS [Draftman],Projects.MainContractor AS [Main Contractor], 
Projects.Client AS [Client/End User], Projects.MainConsultant AS [Main Consultant],Projects.CivilConsultant AS [Civil Consultant], Projects.StartDate as [Start Date], Projects.EndDate As [End Date], Projects.Description
	FROM Projects
	INNER JOIN Employees ON Projects.DesignerID = Employees.ID and and Projects.DraftmanID = Employees.ID

فلم تعطيني اي نتيجة .. 

 

اعتقد اني سأقوم بكتابة أكثر من جملة Select  لكني غير متخيل الطريقة التي سوف اقوم بفلترة الكروس بروداجت وعرض النتائج المطلوبة فقط 

 

فأرجوا من الإخوة مساعدتي في كتابة جملة الـ Select حتي تعرض لي اسماء الموظفين (المصمم والمنفذ والرسام ) من جدول الموظفين بدلا من الأرقام الخاصة بهم ولكم جزيل الشكر

#2

السلام عليكم ورحمة الله وبركاته

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

 


SELECT Projects.ProjectNo AS ID, Projects.ProjectName AS Name, Projects.Capacity AS [Capacity (m3/Day)], Projects.ProjectTitle AS Title,Projects.Address, Employees.EmployeeName AS [Designer], Employees.EmployeeName AS [Executor], Employees.EmployeeName AS [Draftman],Projects.MainContractor AS [Main Contractor], 
Projects.Client AS [Client/End User], Projects.MainConsultant AS [Main Consultant],Projects.CivilConsultant AS [Civil Consultant], Projects.StartDate as [Start Date], Projects.EndDate As [End Date], Projects.Description
	FROM Projects
	INNER JOIN Employees As Designers ON Projects.DesignerID = Designers.ID
    INNER JOIN Employees As Executer ON Projects.DesignerID = Executer.ID
    INNER JOIN Employees As DraftMan ON Projects.DesignerID = DraftMan.ID

لاحظ أن تكون الأرقام المكتوبة فى جدول المشاريع لها مقابل فى جدول الموظفين وإلا لن يعطيك أى نتيجة إذا سقط أحد الأرقام، ولتجنب ذلك يمكنك استبدال الربط بنظام الربط اليسارى

left outer join

 

دعائى بالتوفيق للجميع

9

أدعو الله أن يجعل أعمالنا خالصة لوجهه الكريم --- وأن ينفعنا بما علمنا

Dr Sayed Tohamy

Programming Instructor

مدرب برمجة

---------------

EmaSoft2000

-------------------

#3

جزاكم الله خيرا أخي الدكتور سيد توهامي علي مشاركتك وتقديم المساعدة لي في مشكلتي ..

قمت بتجربة الجملة ولكن لم يتم تنفيذها وكانت رسالة الخطأك كالتالي :

Additional information: SQL logic error or missing database

no such column: Employees.EmployeeName

واعتقد أن الخطأ يكمن فيه هذه الجزئية :

Employees.EmployeeName AS [Designer], Employees.EmployeeName AS [Executor], Employees.EmployeeName AS [Draftman]

فما قول حضراتكم حتي أتخطي هذه المشكلة

 

وجزاكم الله خيرا .. وأسأل الله عز وجل ان ينفع بك

تم تعديل هذه المشاركة بواسطة عمرو عماد في 11 يوليو 2014 في 12:00

#4
عمرو عماد كتب:

جزاكم الله خيرا أخي الدكتور سيد توهامي علي مشاركتك وتقديم المساعدة لي في مشكلتي ..

قمت بتجربة الجملة ولكن لم يتم تنفيذها وكانت رسالة الخطأك كالتالي :

Additional information: SQL logic error or missing database

no such column: Employees.EmployeeName

واعتقد أن الخطأ يكمن فيه هذه الجزئية :

Employees.EmployeeName AS [Designer], Employees.EmployeeName AS [Executor], Employees.EmployeeName AS [Draftman]

فما قول حضراتكم حتي أتخطي هذه المشكلة

 

وجزاكم الله خيرا .. وأسأل الله عز وجل ان ينفع بك

 

وجزاك الله خيراً مثله

بالفعل الخطأ فى هذه الجملة فيجب استبدال أسماء الجدوال بما يكافئها، على سبيل المثال عندما تريد عرض اسم المصمم استخدم اسم الجدول المناسب له فتكون الجملة كالتالى بإذن الله

Designers.EmployeeName AS [Designer], Executor.EmployeeName AS [Executor], Draftman.EmployeeName AS [Draftman]

والجملة كاملة تكون كالتالى بإذن الله

SELECT Projects.ProjectNo AS ID, Projects.ProjectName AS Name, 
Projects.Capacity AS [Capacity (m3/Day)], Projects.ProjectTitle AS Title,Projects.Address,  
Designers.EmployeeName AS [Designer], Executer.EmployeeName AS [Executor], 
DraftMan.EmployeeName AS [Draftman],Projects.MainContractor AS [Main Contractor], 
Projects.Client AS [Client/End User], Projects.MainConsultant AS [Main Consultant],
Projects.CivilConsultant AS [Civil Consultant], Projects.StartDate as [Start Date], 
Projects.EndDate As [End Date], Projects.Description
	FROM Projects
	INNER JOIN Employees As Designers ON Projects.DesignerID = Designers.ID
    INNER JOIN Employees As Executer ON Projects.DesignerID = Executer.ID
    INNER JOIN Employees As DraftMan ON Projects.DesignerID = DraftMan.ID

تم تعديل هذه المشاركة بواسطة ema2000_t في 11 يوليو 2014 في 15:24

9

أدعو الله أن يجعل أعمالنا خالصة لوجهه الكريم --- وأن ينفعنا بما علمنا

Dr Sayed Tohamy

Programming Instructor

مدرب برمجة

---------------

EmaSoft2000

-------------------

#5

جزاكم الله خيرا .. الأن تعمل جيدا الجملة ..

لي سؤالين أخرين :

 

الأول :: هل يمكنني إضافة سطر Where في نهاية الجملة لتصبح علي هذا الشكل

SELECT Projects.ProjectNo AS ID, Projects.ProjectName AS Name, 
Projects.Capacity AS [Capacity (m3/Day)], Projects.ProjectTitle AS Title,Projects.Address,  
Designers.EmployeeName AS [Designer], Executors.EmployeeName AS [Executor], 
DraftMans.EmployeeName AS [Draftman],Projects.MainContractor AS [Main Contractor], 
Projects.Client AS [Client/End User], Projects.MainConsultant AS [Main Consultant],
Projects.CivilConsultant AS [Civil Consultant], Projects.StartDate as [Start Date], 
Projects.EndDate As [End Date], Projects.Description
FROM Projects
	LEFT JOIN Employees As Designers ON Projects.DesignerID = Designers.ID
	LEFT JOIN Employees As Executors ON Projects.ExecutorID = Executors.ID
	LEFT JOIN Employees As DraftMans ON Projects.DraftManID = DraftMans.ID
WHERE ProjectName LIKE '% + txtProjectSearch.Text + %'

والسؤال الأخر : هل الـ SQL لها حساسية الحروف في كلمة البحث المستخدة txtProjectSearch.text

تم تعديل هذه المشاركة بواسطة عمرو عماد في 11 يوليو 2014 في 19:01

#6

عندما أستخدم Like  فإن الـ SQL لا يراعي حساسية الحروف .. بينما عند أستخدام = مباشرة . فقد لاحظ انه في هذه الحالة يراعي حساسية الحروف .. لذلك سأقوم بتعديل سؤال حساسية الحروف إلي ..

كيف أتجنب حساسية الحروف عند المقارنة بإستخدام = مباشرة

#7

بسم الله الرحمن الرحيم وبه نستعين والصلاة والسلام على أشرف المرسلين سيدنا محمد وعلى آله وصحبه أجمعين

بالنسبة لحساسية الحروف فإن السيكوال غير حساس للحروف بطبيعة الحال إلا لو كنت تستخدم خصائص حروف معينة Collation ولكن حتى فى هذه الحالة يمكنك المقارنة بعد تحويل كل الحروف إلى صغيرة فتكون المقارنة كالتالى

where lower(projectname) = lower('Project1')

فبهذه الطريقة قد قمت بتحويل كل القيم إلى حروف صغيرة ثم تتم المقارنة بينهما

ملحوظة: يمكنك تغيير خصائص الحروف ولكن هذا يتطلب منك بعض البحث عن موضوع Collation

 

أما السؤال الثانى فيمكنك عمل المقارنة مع مربع النص عن طريق جمع السلسلة الحرفية بحيث تغلق السلسلة الحرفية قبل مربع النص ثم تجمعه ثم تنشئ سلسلة حرفية بعده

"select * from table1 where lower(ProjectName) = lower('" + txtProjectSearch.Text + "')"

تم تعديل هذه المشاركة بواسطة ema2000_t في 11 يوليو 2014 في 19:36

9

أدعو الله أن يجعل أعمالنا خالصة لوجهه الكريم --- وأن ينفعنا بما علمنا

Dr Sayed Tohamy

Programming Instructor

مدرب برمجة

---------------

EmaSoft2000

-------------------

#8

جزاكم الله خيرا علي مساعدتك .. وأسأل الله عز وجل ان ينفع بها ويجعلها في ميزان حسناتك

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