Все определения элементов сохраняются в столбце определений таблицы GDB_Items. Чтобы определить, какие из элементов являются классами отношений, необходимо ограничить условия поиска только теми элементами, которые относятся к типу классов отношений. Информация, которая определяет элемент как класс отношений, хранится в столбце name таблицы GDB_ItemTypes. Вы можете соединить два таблицы с помощью столбца type таблицы GDB_Items (или представления GDB_Items_vw в Oracle) и столбца UUID таблицы GDB_ItemTypes, затем создать запрос класса отношений из таблицы GDB_ItemTypes.
В следующих примерах используется запрос имени класса отношений и, если это возможно, класса объектов в нем, а также имен обоих таблиц или классов объектов, участвующих в классе отношений. Можно заметить, что при запросе к базе геоданных, также возвращается объектно-связанная аннотация. Это происходит потому, что объектно-связанная аннотация является особым типом класса отношений.
--Queries a geodatabase in PostgreSQL
--Returns a list of relationship classes and their member tables
SELECT
(xpath('//CatalogPath/text()', definition))::text AS "Relationship class and dataset",
(xpath('//OriginClassNames/text()', definition))::text AS "Origin class",
(xpath('//DestinationClassNames/text()', definition))::text AS "Destination class"
FROM
sde.gdb_items items INNER JOIN sde.gdb_itemtypes itemtypes
ON items.type = itemtypes.uuid
WHERE
itemtypes.name = 'Relationship class';
--Queries a dbo-schema geodatabase in SQL Server
--Returns a list of relationship classes and their member tables
SELECT
ITEMS.Definition.value('(/DERelationshipClassInfo/CatalogPath)[1]', 'nvarchar(max)') AS "Relationship Class and dataset",
ITEMS.Definition.value('(/DERelationshipClassInfo/OriginClassNames/Name)[1]', 'nvarchar(max)') AS "Origin Class",
ITEMS.Definition.value('(/DERelationshipClassInfo/DestinationClassNames/Name)[1]', 'nvarchar(max)') AS "Destination Class"
FROM
dbo.GDB_ITEMS AS ITEMS INNER JOIN dbo.GDB_ITEMTYPES AS ITEMTYPES
ON ITEMS.Type = ITEMTYPES.UUID
WHERE
ITEMTYPES.Name = 'Relationship Class';
--Queries a geodatabase in Oracle
--Returns a list of relationship classes and their member tables
SELECT
EXTRACTVALUE(XMLType(Definition), '/DERelationshipClassInfo/CatalogPath') AS "Relationship Class and dataset",
EXTRACTVALUE(XMLType(Definition), '/DERelationshipClassInfo/OriginClassNames/Name') AS "Origin Class",
EXTRACTVALUE(XMLType(Definition), '/DERelationshipClassInfo/DestinationClassNames/Name') AS "Destination Class"
FROM
sde.GDB_ITEMS_VW ITEMS INNER JOIN sde.GDB_ITEMTYPES ITEMTYPES
ON ITEMS.Type = ITEMTYPES.UUID
WHERE
ITEMTYPES.Name = 'Relationship Class';
Эти запросы возвращают список классов отношений, а также классов-источников и классов-адресатов, которые участвуют в классе отношений.
Relationship class and dataset Origin class Destination class ----------------------------------------- -------------------- ------------------------- mygdb.myuser.speciesrel mygdb.myuser.habitat mygdb.myuser.sptable mygdb.uruser.water\\mygdb.uruser.mainanno mygdb.uruser.mains mygdb.uruser.mdiam mygdb.hisuser.roads\\rowgrantrel mygdb.hisuser.row mygdb.hisuser.rowgrantors
Результаты показывают, что база геоданных содержит следующее:
- Отдельный класс отношений speciesrel, в котором участвуют класс объектов habitat и таблица sptable
- Класс объектно-связанной аннотации в наборе классов water, в котором участвуют классы объектов mains и mdiam
- Класс отношений rowgrantrel, который находится в наборе классов roads и состоит из таблиц row и rowgrantors