假设我们有一个名为“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.
我错了吗?
答案 0 :(得分:5)
这里演示的是 join ,但是您使用的网站正在教您过时的隐式连接语法(使用逗号)。我建议不要使用这种语法。而是使用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作为教程。该网站包含许多错误和不良做法。
答案 1 :(得分: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
答案 2 :(得分:0)
你是对的,在你的第一个查询中,第一个表中的每一行都与第二个表中的每一行连接在一起。这将导致每个订单的结果(忽略该订单是否属于Ola Hansen)。
但是,我怀疑你的桌子人员是否包含指令的外挂钥匙。一个诸如
之类的条款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的forreign键,那么会更明智。