这是来自 https://stackoverflow.com/a/2213199/3284469 的查询, 获取表的索引信息。
为什么我们有 pg_class t
和 pg_class i
的 pg_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/