根据表Contracts
,Contract_Plans
和Contract_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
中的字段,而不选择其他表格。
答案 0 :(得分: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
答案 1 :(得分: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
和where
(以及group by
和having
)子句中使用别名(或表名称)。
答案 2 :(得分:1)
是的,您可以从FROM
子句中的任何表中选择任何字段。如果两个表的两个字段具有相同的名称,则必须在字段前添加表的名称(否则您将从解析器中收到错误:“字段名称不明确”)。< / p>
如果您发现它更具可读性,可能前缀明确的字段名称。
实际上它的工作方式与WHERE
子句完全相同。
顺便提一下,如果从多个数据库连接表,则存在相同的要求。如果两个表具有相同的名称,则必须在其名称前加上数据库名称,但如果名称是明确的,则不需要。
哦,你也可以这样做:SELECT table1.*, table2.some_field, table3.* FROM...