выбрать одну строку из типа вложенной таблицы - PullRequest
0 голосов
/ 10 сентября 2018

У меня вопрос, чтобы выбрать только одну запись из этого типа столбца в качестве значения по умолчанию.

enter image description here

create type t_tel as table of number;

create table users_tel(
user_id number,
user_name varchar2(100),
tel t_tel
) nested table tel store as tel_table;

insert into users_tel(user_id, user_name, tel) values (1, 'Amir', t_tel(987,654,321));

select * from users_tel;

Ответы [ 2 ]

0 голосов
/ 10 сентября 2018

Вы можете использовать group для , чтобы сделать это:

select u.user_id, u.user_name, min(t.column_value) def_tel from users_tel u left join table(u.tel) t on 1=1 group by u.user_id, u.user_name;

Обратите внимание, что я использую левое соединение с таблицей Тип, чтобы показать записи, где tel равно нулю.

0 голосов
/ 10 сентября 2018

Используйте выражение коллекции таблиц для обработки коллекции во вложенной таблице, как если бы она была таблицей, и присоединитесь к ней.Затем можно выполнить фильтрацию, чтобы получить по одной строке на user_id:

Скрипка SQL

Настройка схемы Oracle 11g R2 :

create type t_tel as table of number;

create table users_tel(
  user_id number,
  user_name varchar2(100),
  tel t_tel
) nested table tel store as tel_table;

insert into users_tel(user_id, user_name, tel)
  SELECT 1, 'Amir',  t_tel(987,654,321) FROM DUAL UNION ALL
  SELECT 2, 'Dave',  t_tel(123,456)     FROM DUAL UNION ALL
  SELECT 3, 'Kevin', t_tel()            FROM DUAL;

Запрос 1 :

SELECT user_id,
       user_name,
       tel_no
FROM   (
  SELECT u.*,
         t.column_value AS tel_no,
         ROW_NUMBER() OVER ( PARTITION BY u.user_id ORDER BY ROWNUM ) AS rn
  FROM   users_tel u
         LEFT OUTER JOIN
         TABLE( u.tel ) t
         ON ( 1 = 1 )
)
WHERE  rn = 1

Результаты :

| USER_ID | USER_NAME | TEL_NO |
|---------|-----------|--------|
|       1 |      Amir |    987 |
|       2 |      Dave |    123 |
|       3 |     Kevin | (null) |
...