在没有“AS”语句的查询中显示列标题

Fra*_*ois 6 postgresql alias

我使用 JOIN 语句从多个表中查询数据,如下所示:

SELECT u.id,u.name,d.id,d.name FROM user u RIGHT JOIN dog d ON... ;
Run Code Online (Sandbox Code Playgroud)

当我得到答案时,例如在 psql 中,我得到了这种行标题:

|  id   | name  |  id  |  name  |
+-------+-------+------+--------+
Run Code Online (Sandbox Code Playgroud)

相反,我想获得原始和精确的符号:

|  u.id   | u.name  |  d.id  |  d.name  |
+---------+---------+--------+----------+
Run Code Online (Sandbox Code Playgroud)

现在我必须使用AS语句,但重写它是非常重复的,它增加了查询的长度并降低了它的可读性。

有没有办法用 SQL 关键字或 DBMS 参数获得这个结果?

我进行了搜索,但无法找到有关此特定问题的任何信息。

Han*_*non 10

没有用于修改查询结果中显示的列名称的内置方法。这是故意的。

使用AS <alias>构造来控制列名。格式化查询以提高可读性,如下所示:

SELECT u.id         AS "u.id"
     , u.name       AS "u.name"
     , d.id         AS "d.id"
     , d.name       AS "d.name"
FROM user u 
    RIGHT JOIN dog d ON...;
Run Code Online (Sandbox Code Playgroud)

或者,您可以重命名所有列,为每个表使用不同的前缀作为前缀,或者使它们更具描述性。例如:dog_id, dog_name, user_id, user_name。这几乎适用于所有情况(自联接除外)。

请注意,在将数据库实施到生产环境后修改列名将导致大量工作,以确保您已更改数据库内外的所有受影响的代码。另一方面,从长远来看,将通用名称重命名为idname肯定是有益的。我希望好处大于在重命名后通过代码修复名称的麻烦。

id顺便说一句,使用作为每个表的代理键的名称的做法会导致一团糟的不可读和难以理解的代码,并且容易出错。举个例子:

CREATE TABLE T1
(
    id int PRIMARY KEY
);

CREATE TABLE T2
(
    id int PRIMARY KEY
    , t1_id int
);

CREATE TABLE T3
(
    id int PRIMARY KEY
    , t1_id int
    , t2_id int
);

SELECT *
FROM T1
    INNER JOIN T2 ON t1.id = t2.id
    INNER JOIN T3 ON t1.id = t2.id AND t2.id = t3.id
WHERE t2.id = 1;
Run Code Online (Sandbox Code Playgroud)

很明显,上面的查询应该写成:

SELECT *
FROM T1
    INNER JOIN T2 ON t1.id = t2.t1_id
    INNER JOIN T3 ON t1.id = t2.t1_id AND t2.id = t3.t2_id
WHERE t2.id = 1;
Run Code Online (Sandbox Code Playgroud)

如果你这样做,从一开始就更清楚了:

CREATE TABLE T1
(
    t1_id int PRIMARY KEY
);

CREATE TABLE T2
(
    t2_id int PRIMARY KEY
    , t1_id int
);

CREATE TABLE T3
(
    t3_id int PRIMARY KEY
    , t1_id int
    , t2_id int
);

SELECT *
FROM T1
    INNER JOIN T2 ON t1.t1_id = t2.t1_id
    INNER JOIN T3 ON t1.t1_id = t2.t1_id AND t2.t2_id = t3.t2_id
WHERE t2.t2_id = 1;
Run Code Online (Sandbox Code Playgroud)

增加奖金;输出现在显示更明确的列名:

???????????????????????????????????????????????????
? t1_id ? t2_id ? t1_id ? t3_id ? t1_id ? t2_id ?
???????????????????????????????????????????????????

当您使用 PostgreSQL 时,您还可以通过使用USING子句使连接条件更加紧凑而受益:

SELECT *
FROM T1
    INNER JOIN T2 USING (t1_id)
    INNER JOIN T3 USING (t1_id, t2_id)
WHERE t2.t2_id = 1;
Run Code Online (Sandbox Code Playgroud)

通过这种方式,您的查询不仅可以说变得更具可读性,而且对输出也有影响:连接列不会重复。上面的语句会产生这样的输出:

???????????????????????????
? t1_id ? t2_id ? t3_id ?
???????????????????????????


McN*_*ets 5

如果您想要“永久”别名,您可以使用视图而不是表格。

create view v_users
as
    select id as u_id,
           name as u_name,
           ...
    from   users
;

create view v_dogs
as
    select id as d_id,
           name as d_name,
           ...
    from   dogs
;
Run Code Online (Sandbox Code Playgroud)

现在您可以通过以下方式构建查询:

select u_id, u_name, d_id, d_name
from   v_users
join   v_dogs
on     ....
Run Code Online (Sandbox Code Playgroud)