6


0

SQL:交差の構文エラー?

これは私の質問です:

-- 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サーバのバージョンに対応する6行目の「サプライヤーからINTERSECT(SELECT Suppliers.sidがCatalog.sid =燮上のカタログを登録しよう」というマニュアルを確認してください。 _

何がおかしいのですか?

これはスキーマです:

サプライヤー(* sid:整数*、sname:文字列、住所文字列)

パーツ(* pid:整数*、pname:文字列、色:文字列)

カタログ(* sid:整数、pid:整数*、コスト:実数)

太字 =主キー

4 Answer


8


使用しているように見える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」問題だとは思いません。 「INTERSECT」をエミュレートする一般的なソリューションについて、Vinko Vrsalovicが提供する「JOIN」ソリューションを見てください(RDBMSが実際に「INTERSECT」をネイティブに提供する場合でも、私はそれを好むでしょう)。


4


何も、MySQLにはINTERSECTキーワードがありません。 内部結合として書き換えることができます:

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);

確かにこのクエリはより適切に記述できますが、これは、インターセクトが選択された個別の内部結合に過ぎないことを示すためであり、一方を他方に自動的に変換できます。


2


これはあなたが望むことをするはずです:

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"


0


MySQLで* INTERSECT を使用する別の解決策は、 IN *句を使用することです。 問題:「2009年秋と2010年春に提供されるコースのコースIDを検索する」

//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);
  • IN *条項の詳細が必要な場合は、Googleで検索してください。