أريد الحذف باستخدام INNER JOIN
في SQL Server 2008 .
لكنني حصلت على هذا الخطأ:
الرسالة 156 ، المستوى 15 ، الحالة 1 ، السطر 15
بناء جملة غير صحيح بالقرب من الكلمة الأساسية "INNER".
رمز بلدي:
DELETE FROM WorkRecord2
INNER JOIN Employee ON EmployeeRun=EmployeeNo
WHERE Company = '1' AND Date = '2013-05-06'
تحتاج إلى تحديد الجدول الذي تحذف منه ، إليك إصدار به اسم مستعار:
DELETE w
FROM WorkRecord2 w
INNER JOIN Employee e
ON EmployeeRun=EmployeeNo
WHERE Company = '1' AND Date = '2013-05-06'
ما عليك سوى إضافة اسم الجدول بين DELETE
و FROM
من المكان الذي تريد حذف السجلات فيه لأنه يتعين علينا تحديد الجدول المراد حذفه. قم أيضًا بإزالة جملة ORDER BY
لأنه لا يوجد شيء للطلب أثناء حذف السجلات.
لذلك يجب أن يكون الاستعلام النهائي كما يلي:
DELETE WorkRecord2
FROM WorkRecord2
INNER JOIN Employee
ON EmployeeRun=EmployeeNo
WHERE Company = '1'
AND Date = '2013-05-06';
جرب هذا:
DELETE FROM WorkRecord2
FROM Employee
Where EmployeeRun=EmployeeNo
And Company = '1'
AND Date = '2013-05-06'
ممكن يكون هذا مفيدًا لك -
DELETE FROM dbo.WorkRecord2
WHERE EmployeeRun IN (
SELECT e.EmployeeNo
FROM dbo.Employee e
WHERE ...
)
أو جرب هذا -
DELETE FROM dbo.WorkRecord2
WHERE EXISTS(
SELECT 1
FROM dbo.Employee e
WHERE EmployeeRun = e.EmployeeNo
AND ....
)
يجب أن يكون:
DELETE zpost
FROM zpost
INNER JOIN zcomment ON (zpost.zpostid = zcomment.zpostid)
WHERE zcomment.icomment = "first"
هذا الإصدار يجب أن يعمل
DELETE WorkRecord2
FROM WorkRecord2
INNER JOIN Employee ON EmployeeRun=EmployeeNo
Where Company = '1' AND Date = '2013-05-06'
جرب هذا الاستعلام:
DELETE WorkRecord2, Employee
FROM WorkRecord2
INNER JOIN Employee ON (tbl_name.EmployeeRun=tbl_name.EmployeeNo)
WHERE tbl_name.Company = '1'
AND tbl_name.Date = '2013-05-06';
في SQL Server Management Studio ، يمكنني بسهولة إنشاء استعلام SELECT.
SELECT Contact.Naam_Contactpersoon, Bedrijf.BedrijfsNaam, Bedrijf.Adres, Bedrijf.Postcode
FROM Contact
INNER JOIN Bedrijf ON Bedrijf.IDBedrijf = Contact.IDbedrijf
يمكنني تنفيذه ، وتظهر جميع جهات الاتصال الخاصة بي.
الآن قم بتغيير SELECT إلى DELETE:
DELETE Contact
FROM Contact
INNER JOIN Bedrijf ON Bedrijf.IDBedrijf = Contact.IDbedrijf
ستتم إزالة جميع السجلات التي شاهدتها في عبارة SELECT.
يمكنك إنشاء ارتباط داخلي أكثر صعوبة مع نفس الإجراء ، على سبيل المثال:
DELETE FROM Contact
INNER JOIN Bedrijf ON Bedrijf.IDBedrijf = Contact.IDbedrijf
INNER JOIN LoginBedrijf ON Bedrijf.IDLoginBedrijf = LoginBedrijf.IDLoginBedrijf
DELETE a FROM WorkRecord2 a
INNER JOIN Employee b
ON a.EmployeeRun = b.EmployeeNo
Where a.Company = '1'
AND a.Date = '2013-05-06'
جرب هذا ، قد يساعد
DELETE WorkRecord2
FROM WorkRecord2
INNER JOIN Employee
ON EmployeeRun=EmployeeNo
WHERE Company = '1'
AND Date = '2013-05-06';
طريقة أخرى باستخدام CTE
.
;WITH cte
AS (SELECT *
FROM workrecord2 w
WHERE EXISTS (SELECT 1
FROM employee e
WHERE employeerun = employeeno
AND company = '1'
AND date = '2013-05-06'))
DELETE FROM cte
ملاحظة: لا يمكننا استخدام JOIN
داخل CTE
عندما تريد delete
.
هذا استعلام بسيط لحذف السجلات من جدولين في وقت واحد.
DELETE table1.* ,
table2.*
FROM table1
INNER JOIN table2 ON table1.id= table2.id where table1.id ='given_id'
لا تحدد الجداول Company
و Date
، فقد ترغب في إصلاح ذلك.
مزود قياسي باستخدام MERGE
:
MERGE WorkRecord2 T
USING Employee S
ON T.EmployeeRun = S.EmployeeNo
AND Company = '1'
AND Date = '2013-05-06'
WHEN MATCHED THEN DELETE;
الجواب منDevart هو أيضًا SQL قياسي على الرغم من عدم اكتماله ، يجب أن يبدو أكثر من هذا القبيل:
DELETE
FROM WorkRecord2
WHERE EXISTS ( SELECT *
FROM Employee S
WHERE S.EmployeeNo = WorkRecord2.EmployeeRun
AND Company = '1'
AND Date = '2013-05-06' );
الشيء المهم الذي يجب ملاحظته حول ما سبق هو أنه من الواضح أن الحذف يستهدف جدولًا واحدًا ، كما هو مطبق في المثال الثاني من خلال طلب استعلام فرعي قياسي.
بالنسبة لي إجابات بناء الجملة المختلفة يصعب قراءتها وفهمها. أعتقد أن أفضل طريقة يمكن وصفها هي أن التفكير في الإجابة من خلالfrans eilering ، أي أن الشخص الذي يكتب الرمز لا يهتم بالضرورة بالشخص الذي سيقرأ الكود ويحافظ عليه.
هنا هو إصدار SQL Server الخاص بي
DECLARE @ProfileId table(Id bigint)
DELETE FROM AspNetUsers
OUTPUT deleted.ProfileId INTO @ProfileId
WHERE Email = @email
DELETE FROM UserProfiles
WHERE Id = (Select Id FROM @ProfileId)
إليك ما أستخدمه حاليًا للحذف أو حتى التحديث:
DELETE FROM w
FROM WorkRecord2 w,
Employee e
WHERE w.EmployeeRun = e.EmployeeNo
AND w.Company = '1'
AND w.Date = '2013-05-06'