سؤال

هذا هو استعلامي:

-- Sids of suppliers who supply a green part AND a red part
(SELECT Suppliers.sid
FROM Suppliers
JOIN Catalog ON Catalog.sid = Suppliers.sid
JOIN Parts ON Parts.pid = Catalog.pid
WHERE Parts.color = "red")
INTERSECT
(SELECT Suppliers.sid
FROM Suppliers
JOIN Catalog ON Catalog.sid = Suppliers.sid
JOIN Parts ON Parts.pid = Catalog.pid
WHERE Parts.color = "green");

هذا هو الخطأ:

خطأ 1064 (42000): لديك خطأ في بناء جملة SQL ؛ تحقق من الدليل الذي يتوافق مع إصدار خادم MySQL الخاص بك للحصول على بناء الجملة الأيمن لاستخدامه بالقرب من "Intersect (حدد الموردين.

ما الخطأ الذي افعله؟

هذا هو المخطط:

الموردون (SID: عدد صحيح, ، sname: سلسلة ، سلسلة العنوان)

القطع(PID: عدد صحيح, ، pname: سلسلة ، اللون: سلسلة)

فهرس(SID: عدد صحيح ، PID: عدد صحيح, التكلفة: حقيقي)

بالخط العريض = المفتاح الأساسي

هل كانت مفيدة؟

المحلول

MySQL ، الذي يبدو أنك تستخدمه ، لا يدعم INTERSECT بناء الجملة. سيتعين عليك حلها بطريقة أخرى.

في هذه الحالة ، يكون التافهة - نحتاج فقط إلى قائمة بجميع الموردين الذين يقدمون "أخضر" و "أحمر" لبعض جزء - لا يكلف استعلامك عناء معرفة ما إذا كانت الأجزاء نفسها مرتبطة ، لذلك يمكننا حلها بسهولة تامة. مثله:

SELECT Suppliers.sid
FROM Suppliers
JOIN Catalog ON Catalog.sid = Suppliers.sid
JOIN Parts ON Parts.pid = Catalog.pid
WHERE Parts.color IN ('red', 'green')
GROUP BY Suppliers.sid
HAVING COUNT(DISTINCT Parts.color) = 2

أنا شخصياً لا أعتقد أن الاستعلام الأصلي نموذجي INTERSECT مشكلة. ألق نظرة على JOIN الحل الذي يقدمه Vinko Vrsalovic لحل عام لمحاكاة INTERSECT (وهو ما أود أن أفضله حتى لو كانت RDBMS ستعرض في الواقع INTERSECT أصلا).

نصائح أخرى

لا شيء ، MySQL ليس لديه الكلمة الرئيسية المتقاطعة. يمكنك إعادة كتابتها كضجة داخلية:

SELECT DISTINCT sid FROM
(SELECT Suppliers.sid
FROM Suppliers
JOIN Catalog ON Catalog.sid = Suppliers.sid
JOIN Parts ON Parts.pid = Catalog.pid
WHERE Parts.color = "red") a
INNER JOIN
(SELECT Suppliers.sid
FROM Suppliers
JOIN Catalog ON Catalog.sid = Suppliers.sid
JOIN Parts ON Parts.pid = Catalog.pid
WHERE Parts.color = "green") b
ON (a.sid = b.sid);

من المؤكد أن هذا الاستعلام يمكن كتابة أفضل ، ولكن هذا هو إظهار أن التقاطع هو مجرد انضمام داخلي مع مختار متميز ، يمكنك تحويل واحد تلقائيًا إلى الآخر.

هذا يجب أن يفعل ما تريد:

SELECT Suppliers.sid
FROM Suppliers
JOIN Catalog ON Catalog.sid = Suppliers.sid
INNER JOIN Parts AS parts1 ON parts1.pid = Catalog.pid AND parts1.color = "red"
INNER JOIN Parts AS parts2 ON parts2.pid = Catalog.pid AND parts2.color = "green"

حل آخر من أجل الاستخدام تتقاطع في MySQL للاستخدام في بند. مشكلة: "العثور على معرف الدورة التدريبية للدورات المقدمة في خريف 2009 وربيع 2010"

//DML sample
(select course_id
from section
where semester = ‘Fall’ and year = ‘2009’)
intersect
(select course_id
from section
where semester = ‘Spring’ and year = ‘2010’);

في MySQL:

select distinct course_id
from section
where semester = 'Fall' and year= 2009 and
course_id in (select course_id
from section
where semester = 'Spring' and year= 2010);

إذا كنت بحاجة إلى المزيد في جملة ، يرجى البحث على Google.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top