2012-06-11 165 views
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' 

林混淆的订单ID,becouse它并不比任何诸如此类。

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. 

我错了吗?

回答

0

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

但是,我怀疑你的表人员包含forreign订单的键。一个条款,如

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每一行包含forreign关键是做订单的人员。

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 
+0

我会将您的代码更改为显式连接... – Ben

+0

我可以这样做,但我只是想匹配他自己的语法。我正在纠正逻辑,而不是语法,因为我不想混淆他。 – Sebas

5

这里正在证明是加入,但您使用本网站所教导你的过时的隐式连接语法(用逗号分隔)。我建议不要这种语法。请使用JOIN关键字。

我检查了现场,并发现了什么原example code是(你的问题没有说清楚):

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作为教程。该网站包含许多错误和不良做法。

+0

,但逻辑并不完全正确......他的问题是关于要加入什么,而不是如何去做。您在人员表上没有orderid – Sebas

+0

旧的连接语法在复杂的查询中很难读取。 –

+0

我们不知道表结构,但我认为Product_Orders表将包含某种人员ID(我们称之为person_id)来标识订单所关联的人员。连接条件应该是'ON po.person_id = p.person_id'。 –