Почему таблица должна быть сглажена дважды в одном запросе?

спросил: 13 июня 2018 в 09:46 в: sql

Вот запрос из https://stackoverflow.com/a/2213199/3284469, которые получают информацию об индексах таблицы.

Почему у нас есть два псевдонима pg_class по pg_class t и pg_class i?

Можно заменить 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;

1 ответ

Есть решение
Alan ответил: 13 июня 2018 в 09:58

В запросе часто используется псевдоним таблицы, где вам нужно ссылаться на две разные записи из одной и той же таблицы.

Общие ситуации: где таблица имеет собственный указатель, например. Сотрудники, в которых каждый сотрудник указывает на менеджера - другого сотрудника. Viz:

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 как о SET данных, а не таблиц. Это важный шаг в изучении качества SQL. Набор может быть представлен таблицей, подмножеством таблицы или другим запросом из таблиц, другими запросами или константами или комбинацией.

В этом случае базовая таблица является полиморфной - она хранит данные нескольких разных типов. Таким образом, подмножество используется для обращения к другой информации в таблице.