2013-06-12 47 views
0

給定表格Contracts,Contract_PlansContract_Plan_Tags,我可以從內部聯接查詢中的所有三個選擇特定字段嗎?從兩個內部聯接中選擇特定字段

目前,我有

SELECT * FROM Contracts 
INNER JOIN Contract_Plans 
ON Contracts.ContractNum = Contract_Plans.ContractNum 
INNER JOIN Contract_Plan_Tags 
ON Contracts.ContractNum = Contract_Plan_Tags.ContractNum 
WHERE Contract_Plan_Tags.tag_id = 44 OR Contract_Plan_Tags.tag_id = 45 

此查詢返回的所有領域,但有什麼辦法可以選擇從連接表的具體領域?

我知道我可以做

SELECT ContractNum, ContractName FROM Contracts 
... 
... 

,但只有選擇從Contracts,而不是其他表中的字段。

SELECT Contracts.This, Contract_Plan_Tags.That, Contract_Plans.There FROM Contracts 
INNER JOIN Contract_Plans 
ON Contracts.ContractNum = Contract_Plans.ContractNum 
INNER JOIN Contract_Plan_Tags 
ON Contracts.ContractNum = Contract_Plan_Tags.ContractNum 
WHERE Contract_Plan_Tags.tag_id = 44 OR Contract_Plan_Tags.tag_id = 45 

回答

2

你應該瞭解表的別名:

2

如果爲了讓MySQL來區分它們必須通過前綴的表名的字段。最好的表別名是這些表的簡短縮寫。然後,您可以列出領域與別名:

SELECT c.ContractNum, c.ContractName, cpt.tag_id, . . . 
FROM Contracts c 
INNER JOIN Contract_Plans cp 
ON c.ContractNum = cp.ContractNum 
INNER JOIN Contract_Plan_Tags cpt 
ON c.ContractNum = cpt.ContractNum 
WHERE cpt.tag_id in (44, 45) 

我注意到您使用where子句中的表名,所以我希望我理解正確的問題。您可以在selectwhere(和group byhaving)子句中使用別名(或表名)。

1

是的,您可以從FROM條款的任何表中選擇任何字段。如果兩個表中的兩個字段具有相同的名稱,則您必須在該字段前面添加表名(否則您會從解析器中獲取錯誤:「字段名稱不明確」)。

可能如果您發現它更具可讀性,則也爲明確的字段名稱加上前綴。

事實上,它的工作原理與WHERE條款中的完全相同。

順便提一句,如果您連接來自多個數據庫的表,則存在相同的要求。如果兩個表具有相同的名稱,則必須在名稱前加上數據庫名稱,但如果名稱是明確的,則不需要。你可以這樣做:SELECT table1.*, table2.some_field, table3.* FROM...