如何使用JOIN运算符编写查询?

时间:2013-12-03 04:18:10

标签: sql database oracle

考虑以下架构:

Suppliers(sid: integer, sname: string, address: string)
Parts(pid: integer, pname: string, color: string)
Catalog(sid: integer, pid: integer, cost: real)

关键字段带下划线,字段名称后面列出了每个字段的域。 因此,sid是供应商的关键,pid是零件的关键,sid和pid在一起 形成目录的关键。目录关系列出了按部件收取的价格 供应商。

现在我正在尝试解决这个SQL语句 -

Find the sids of suppliers who supply some red part and some green part.

我提出了这个SQL查询,但不确定这是否正确 -

SELECT C.sid
FROM Parts P, Catalog C
WHERE P.color = `red' AND P.pid = C.pid
AND EXISTS ( SELECT P2.pid
FROM Parts P2, Catalog C2
WHERE P2.color = `green' AND C2.sid = C.sid
AND P2.pid = C2.pid )

有什么办法,我可以使用JOIN运算符编写上面相同的查询。存在运算符让我有点困惑。编写上述查询的最简单方法是什么?

2 个答案:

答案 0 :(得分:0)

SELECT C.sid
FROM Catalog AS C
INNER JOIN Parts AS P
    ON C.pid = P.pid
INNER JOIN Suppliers AS S
    ON C.sid = S.sid
WHERE P.color = `red' AND P.color = `green'

答案 1 :(得分:0)

目标是找到从目录中提供绿色和红色部分的供应商。

因此,我为目录和零件创建了一个“绿色”别名,并为目录和零件创建了一个“红色”别名,我内部加入它们以确保只有供应两种类型零件的供应商才会在结果集中。

此外,对于给定的供应商,可以有多个红色和绿色部分,因此我选择使用“选择不同”而不是“选择”。

SELECT DISTINCT Cr.sid 
FROM Parts Pg,
    Parts Pr,
    Catalog Cg, 
    Catalog Cr 
 WHERE
     Cg.sid = Cr.sid
     AND Cg.pid = Pg.pid
     AND Cr.pid = Pr.pid
     AND Pr.color = 'red'
     AND Pg.color = 'green'