在子查询的外部查询中使用别名与不使用别名之间的区别



我有在外部查询中使用或不使用别名的代码。两者都运行良好,并提供了类似的结果。

在外部查询中不使用别名:

SELECT DISTINCT ON (msg_id, msg_checksum) *
FROM 
(
SELECT id, jsonb_var,  
jsonb_var ->> 'id' as msg_id,
jsonb_var ->> 'checksum' as msg_checksum
FROM testing_json_as_table
) AS subquery_table_with_msg_id_and_msg_checksum
ORDER BY msg_id, msg_checksum;

在外部查询中使用别名:

SELECT DISTINCT ON (subquery_table_with_msg_id_and_msg_checksum.msg_id, subquery_table_with_msg_id_and_msg_checksum.msg_checksum) *
FROM 
(
SELECT id, jsonb_var,  
jsonb_var ->> 'id' as msg_id,
jsonb_var ->> 'checksum' as msg_checksum
FROM testing_json_as_table
) AS subquery_table_with_msg_id_and_msg_checksum
ORDER BY subquery_table_with_msg_id_and_msg_checksum.msg_id, subquery_table_with_msg_id_and_msg_checksum.msg_checksum;

我的问题是:

  1. 为什么两个代码给出相似的结果
  2. 我应该在外部查询中使用别名,什么时候不使用

通常,我建议始终限定列名(即使用别名(。同时,我推荐简单的别名、缩写。因此:

SELECT DISTINCT ON (tjt.msg_id, tjt.msg_checksum) *
FROM (SELECT id, jsonb_var,  
jsonb_var ->> 'id' as msg_id,
jsonb_var ->> 'checksum' as msg_checksum
FROM testing_json_as_table
) tjt
ORDER BY tjt.msg_id, tjt.msg_checksum;

这里tjttesting_json_as_table的缩写。

也就是说,如果您在查询中一次只引用一个表(如本例中所示(,那么您可以放宽";总是限定所有列";规则

最新更新