如何在 MySQL 中使用自动表别名生成查询结果?

Posted

技术标签:

【中文标题】如何在 MySQL 中使用自动表别名生成查询结果?【英文标题】:How to produce query results with automatic table aliases in MySQL? 【发布时间】:2019-03-07 00:59:24 【问题描述】:

mysql 版本 10 (MariaDB)。 php 5.6.3 libmysql 5.1.73

我与 Oracle 合作已经有一段时间了,但我隐约记得 Oracle 完全按照我在这个示例中的预期做了。我可能弄错了,或者 MySQL 只是没有做同样的事情......这个例子是为这个问题创建的,所以如果你看到语法问题,它与此有关。

假设这样一个简单的模式:

Table COUNTRY
ID
NM

Table PROVINCE
ID
NM
CTID

我希望这个查询:

SELECT * FROM PROVINCE P JOIN COUNTRY C ON C.ID = P.CTID

会产生以下输出:

P.ID | P.NM | P.CTID | C.ID | C.NM

不幸的是,输出没有表别名,并且所选表中的联接表中的列从结果中丢失(结果中只有一个 ID 列)。像这样:

ID | NM | CTID

有没有办法获得上面显示的别名输出?或者是否有其他方法可以获取结果中的所有五列而无需在查询中明确使用P.ID as P_ID 之类的东西?

【问题讨论】:

In a join, how to prefix all column names with the table it came from的可能重复 我无法使用ON 子句通过您给定的查询重现ID | NM | CTID。它生成没有表名的 all 列。仅当应用 USING 原因时,没有重复的列,因为 USING 开箱即用地加入相等性。问题细节应该更准确。 【参考方案1】:

MySQL 不会像那样创建合格的别名。如果您没有明确命名别名,如果选择列表在多个表中包含具有相同名称的列,则结果中将出现重复的列名。

您不必为所有列创建别名,只需为您需要区分的那些。

您不必放弃通配符,但应将通配符限制为特定表,您无需为其创建别名。

SELECT C.*, P.ID AS P_ID, P.NM AS P_NM
FROM PROVINCE P JOIN COUNTRY C ON C.ID = P.CTID

【讨论】:

以上是关于如何在 MySQL 中使用自动表别名生成查询结果?的主要内容,如果未能解决你的问题,请参考以下文章

MySQL派生表

MYSQL数据库--定义表和字段的别名

MySQL-复杂查询及条件-起别名-多表查询-04

如何使用 laravel 查询生成器从表联合的结果中选择列?

MySQL查询

mysql 怎么把查询结果作为表名继续查询