12

これは私のクエリです:

-- 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 構文にエラーがあります。6 行目の「INTERSECT (SELECT Suppliers.sid FROM Suppliers JOIN Catalog ON Catalog.sid = Sup」の近くで使用する正しい構文については、MySQL サーバーのバージョンに対応するマニュアルを確認してください。

私は何を間違っていますか?

これはスキーマです:

サプライヤー ( sid: 整数、sname: 文字列、アドレス文字列)

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

Catalog( sid: 整数、pid: 整数、コスト: 実数)

太字= 主キー

4

6 に答える 6

13

INTERSECTあなたが使用していると思われるMySQLは、構文をサポートしていません。別の方法で解決する必要があります。

この場合、それは些細なことです - 部品の「グリーン」と「レッド」を提供するすべてのサプライヤーのリストだけが必要です - あなたのクエリは部品自体が関連しているかどうかを確認することを気にしないので、私たちはそれを非常に簡単に解決することができますこのような:

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にネイティブに提供する場合でも、私はこれを好みます)。

于 2010-02-20T16:52:12.650 に答える
5

いいえ、MySQL には INTERSECT キーワードがありません。INNER JOIN として書き直すことができます。

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

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

于 2010-02-20T16:53:41.260 に答える
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"
于 2010-02-20T16:50:12.797 に答える
1

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 で検索してください。

于 2017-10-26T04:30:49.637 に答える