4

在我的公司,我们使用 Oracle 数据库。我注意到每个人都这样写他们的查询:

SELECT p.name, p.id, o.issued_date
FROM orders o, products p
WHERE o.productid = p.id;

在这种情况下,数据库在做什么?制作笛卡尔积然后只选择某些行?这听起来不太对劲。

4

3 回答 3

6

在这种情况下,数据库在做什么?

与指定 ANSI 连接时相同:

SELECT *
FROM orders o
JOIN products p ON o.productid = p.id

我注意到每个人都这样写他们的查询 [...]

看起来贵公司的很多人都有多年的 Oracle 经验!我敢打赌,他们也使用(+)外连接表示法。这是 Oracle在 9i 版本之前唯一支持的语法。

于 2013-01-31T14:41:42.827 回答
2

实际上,这是内部连接最古老的 ANSI 标准。其他回复中的人提到它不是ANSI语法,但它不太正确。构造像

SELECT p.name, p.id, o.issued_date
FROM orders o, products p
WHERE o.productid = p.id;

遵循 SQL 的 ANSI 88 标准(现在称为隐式连接表单)。然而,它已被更新的 ANSI 92 显式形式的内连接、外连接和交叉连接所取代:

-- Inner join
SELECT p.name, p.id, o.issued_date
FROM orders o [INNER] JOIN products p
ON o.productid = p.id
WHERE (residual conditions);

-- Outer joins:
SELECT p.name, p.id, o.issued_date
FROM orders o LEFT|RIGHT|FULL [OUTER] JOIN products p
ON o.productid = p.id
WHERE (residual conditions);

-- Explicit corss join:
SELECT p.name, p.id, o.issued_date
FROM orders o CROSS JOIN products p
WHERE (residual conditions);

这正是因为先前的语法具有误导性并且容易出错,因为连接条件很容易与剩余条件混合并且可能被错误地丢失。这就是强烈建议使用显式语法的原因。

方括号[]表示'noise'(可选)关键字,竖线| 表示“或”(您可以将它们放在 LEFT 或 RIGHT 或 FULL 中,而不是全部)。我希望这有帮助。

于 2013-07-23T19:17:16.973 回答
0

是这样的:

SELECT 
     *
FROM 
     Orders o
INNER JOIN 
     Products p
ON
     p.id=o.ProductID

请注意,您永远不应该SELECT *...列出您需要的列。您还应该明确说明连接的类型(内、左、右、外)。这是实现连接的正确方法,并且是 ANSI 语法。

于 2013-01-31T14:40:23.543 回答