sql - 为什么在同一个查询中一个表会被别名两次?

标签 sql postgresql

这是来自 https://stackoverflow.com/a/2213199/3284469 的查询, 获取表的索引信息。

为什么我们有 pg_class tpg_class ipg_class 两个别名?

能否将i.oid = ix.indexrelid替换为t.oid = ix.indexrelid

谢谢。

select
    t.relname as table_name,
    i.relname as index_name,
    a.attname as column_name
from
    pg_class t,
    pg_class i,
    pg_index ix,
    pg_attribute a
where
    t.oid = ix.indrelid
    and i.oid = ix.indexrelid
    and a.attrelid = t.oid
    and a.attnum = ANY(ix.indkey)
    and t.relkind = 'r'
    and t.relname like 'test%'
order by
    t.relname,
    i.relname;

最佳答案

在您需要引用同一张表中的两条不同记录的情况下,在查询中为一个表设置两次别名是很常见的。

常见的情况是表有一个自指针,例如每个员工都指向一个经理的员工 - 另一个员工。即:

EmpID   Name         ManagerID
1       John Boss    NULL
2       Mary Manager 1
3       Brian        2
4       Simon        2
5       Susan        2

在上表中,约翰是老板,玛丽向约翰汇报,其他三名员工向玛丽汇报。

如果你想得到每个员工和他们老板的列表,你需要为表添加两次别名:

SELECT worker.Name, boss.ManagerName
FROM 
    Employees AS worker
    LEFT JOIN Employees as boss ON worker.ManagerID = boss.EmpID

您还可以使用它来汇总每一层监督下的员工工资成本等。

所以在你的问题中,不,你不能用另一个替换一个,因为你实际上是在引用表中的一组不同的记录。

您需要将 SQL 视为数据集,而不是表。这是学习优质 SQL 的重要一步。 Set 可以由表、表的子集或由表组成的另一个查询、其他查询、常量或组合来表示。

在这种情况下,基础表是多态的——它存储多种不同类型的数据。因此,子集用于引用表中的不同信息。

关于sql - 为什么在同一个查询中一个表会被别名两次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51227683/

相关文章:

sql - 使用 ROWNUM 时的区别

c# - 存储过程不是那么快吗?

sql - 插入新行并获取主键或获取现有记录的主键

json - 将 JSON 存储在 msSQL 数据库中?

php - Left Join获取上一条记录sql

捕获到 ruby​​rep 异常:PG::ConnectionBad:连接已关闭:显示搜索路径

postgresql - Autovacuum 未在 Openshift Online Postgres 盒式磁带上运行

ruby-on-rails - 删除 rails 迁移中的默认列

postgresql - 使用简单模型对 1TB 数据进行报告/分析的数据库

sql - 如何在 hive 中提取字符串的一部分