Тип таблицы CONNECT OCCUR
Аналогично типу таблицы XCOL, тип OCCUR является расширением типа PROXY, когда речь идет о таблице или представлении, имеющей несколько столбцов, содержащих данные одного типа. Он позволяет получить другое представление таблицы, где данные из этих столбцов помещаются в один столбец, что в конечном итоге приводит к генерации нескольких строк из одной строки таблицы-источника. Например, предположим, что у нас есть таблица pets:
| name | dog | cat | rabbit | bird | fish |
|---|---|---|---|---|---|
| John | 2 | 0 | 0 | 0 | 0 |
| Bill | 0 | 1 | 0 | 0 | 0 |
| Mary | 1 | 1 | 0 | 0 | 0 |
| Lisbeth | 0 | 0 | 2 | 0 | 0 |
| Kevin | 0 | 2 | 0 | 6 | 0 |
| Donald | 1 | 0 | 0 | 0 | 3 |
Мы можем создать таблицу occur следующим образом:
create table xpet ( name varchar(12) not null, race char(6) not null, number int not null) engine=connect table_type=occur tabname=pets option_list='OccurCol=number,RankCol=race' Colist='dog,cat,rabbit,bird,fish';
При отображении ее следующим образом:
select * from xpet;
Мы получим результат:
| name | race | number |
|---|---|---|
| John | dog | 2 |
| Bill | cat | 1 |
| Mary | dog | 1 |
| Mary | cat | 1 |
| Lisbeth | rabbit | 2 |
| Kevin | cat | 2 |
| Kevin | bird | 6 |
| Donald | dog | 1 |
| Donald | fish | 3 |
Прежде всего, значения столбцов, перечисленных в параметре Colist, помещаются в отдельный столбец, имя которого задается параметром OccurCol. Когда несколько столбцов имеют ненулевые (или псевдо-нулевые) значения, генерируются несколько строк, а значения других обычных столбцов повторяются.
Кроме того, добавлен необязательный специальный столбец, имя которого задается параметром RankCol. Этот столбец содержит имя исходного столбца, из которого происходит значение столбца OccurCol. Это позволяет узнать породу животных, количество которых указано в столбце number.
Этот тип таблицы позволяет выполнять запросы, которые были бы более сложными в исходных таблицах. Например, чтобы узнать, у кого больше одного животного определенного вида, вы можете просто запросить:
select * from xpet where number > 1;
Вы получите результат:
| name | race | number |
|---|---|---|
| John | dog | 2 |
| Lisbeth | rabbit | 2 |
| Kevin | cat | 2 |
| Kevin | bird | 6 |
| Donald | fish | 3 |
Примечание 1: Как и для таблиц XCOL, умножение строк для запросов, не включающих столбец Occur, не производится.
Примечание 2: Поскольку столбец OccurCol был объявлен как «не допускающий NULL», для нулевых или псевдо-нулевых значений в списке столбцов строки не генерировались. Если столбец OccurCol объявлен как допускающий NULL, строки также генерируются для столбцов, содержащих нулевые или псевдо-нулевые значения.
Таблицы occur также могут быть определены из представлений или определения источника. Кроме того, CONNECT может генерировать определения столбцов, если они не указаны. Например:
create table ocsrc engine=connect table_type=occur colist='january,february,march,april,may,june,july,august,september, october,november,december' option_list='rankcol=month,occurcol=day' srcdef='select ''Foo'' name, 8 january, 7 february, 2 march, 1 april, 8 may, 14 june, 25 july, 10 august, 13 september, 22 october, 28 november, 14 december';
Эта таблица отображается следующим образом:
| name | month | day |
|---|---|---|
| Foo | january | 8 |
| Foo | february | 7 |
| Foo | march | 2 |
| Foo | april | 1 |
| Foo | may | 8 |
| Foo | june | 14 |
| Foo | july | 25 |
| Foo | august | 10 |
| Foo | september | 13 |
| Foo | october | 22 |
| Foo | november | 28 |
| Foo | december | 14 |
© 2023 MariaDB
Licensed under the Creative Commons Attribution 3.0 Unported License and the GNU Free Documentation License.
https://mariadb.com/kb/en/connect-occur-table-type/