2012-06-11 97 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'。 –