2013-06-12 50 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...