0

假设我们有一个名为“Persons”的表和另一个名为“Product_Orders”的表。我们将分别给出“p”和“po”的表别名。

现在我们要列出“Ola Hansen”负责的所有订单。

我们使用以下 SELECT 语句:

SELECT po.OrderID, p.LastName, p.FirstName 
FROM Persons AS p, Product_Orders AS po 
WHERE p.LastName='Hansen' AND p.FirstName='Ola'

我对 OrderID 感到困惑,因为它无法与类似的东西进行比较。

SELECT po.OrderID, p.LastName, p.FirstName 
FROM Persons AS p, Product_Orders AS po 
WHERE p.LastName='Hansen' AND p.FirstName='Ola'
  AND po.OrderID = p.OrderID.

我错了吗?

4

3 回答 3

5

这里演示的是join,但是您使用的网站正在教您过时的隐式连接语法(带逗号)。我建议不要使用这种语法。而是使用JOIN关键字。

我检查了该站点并发现了原始示例代码是什么(您的问题并不清楚):

SELECT po.OrderID, p.LastName, p.FirstName
FROM Persons AS p,
Product_Orders AS po
WHERE p.LastName='Hansen' AND p.FirstName='Ola'

他们忘了添加加入条件!

我会改用这样的写法JOIN

SELECT po.OrderID, p.LastName, p.FirstName
FROM Persons AS p
JOIN Product_Orders AS po
ON po.PersonId = p.Id
WHERE p.LastName = 'Hansen' AND p.FirstName = 'Ola'

现在您可以清楚地看到po.PersonId = p.Id条件指定了两个表之间的关系,并显示了它们应该如何连接。使用关键字的众多优点之一JOIN是很难忘记编写连接条件,并且在缺少时很明显。

您应该避免使用 w3schools.com 作为教程。该网站包含许多错误和不良做法。

于 2012-06-11T19:41:44.637 回答
0
SELECT po.OrderID, p.LastName, p.FirstName 
FROM Persons AS p, Product_Orders AS po 
WHERE p.LastName='Hansen' AND p.FirstName='Ola'
  AND p.PersonID = po.PersonID
于 2012-06-11T19:41:31.780 回答
0

你是对的,在你的第一个查询中,第一个表中的每一行都与第二个表中的每一行相连。这将导致每个订单的结果(忽略订单是否属于 Ola Hansen)。

但是,我怀疑您的 Persons 表是否包含命令的外键。一个子句如

SELECT po.OrderID, p.LastName, p.FirstName 
FROM Persons AS p, Product_Orders AS po 
WHERE p.LastName='Hansen' AND p.FirstName='Ola'
AND po.PersonID = p.PersonID

假设 Product_Orderds 中的每一行都包含执行该订单的 Person 的外键,这会更明智。

于 2012-06-11T19:46:08.563 回答