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,而不是其他表。

4

3 回答 3

2

如果为了让 MySQL 区分它们,您必须在字段前面加上它们的表名:

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
于 2013-06-12T18:02:55.453 回答
2

您应该了解表别名。最好的表别名是表的缩写。然后,您可以列出具有别名的字段:

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子句中使用了表名,所以我希望我能正确理解这个问题。select您可以在and where(and group byand having) 子句中使用别名(或表名) 。

于 2013-06-12T18:07:22.860 回答
1

是的,您可以从FROM子句的任何表中选择任何字段。如果两个表的两个字段具有相同的名称,那么您必须在字段前面加上表的名称(否则您会从解析器收到错误:“字段名称不明确”)。

如果您发现它更具可读性,您也可以为明确的字段名称添加前缀。

WHERE事实上,它的工作方式与子句中的完全相同。

顺便说一句,如果您连接来自多个数据库的表,则存在相同的要求。如果两个表具有相同的名称,则必须在它们的名称前面加上数据库名称,但如果名称明确,则不需要。

哦,你也可以这样做:SELECT table1.*, table2.some_field, table3.* FROM...

于 2013-06-12T18:09:38.440 回答