Выбор разных значений подтипа в одном запросе - PullRequest
1 голос
/ 24 сентября 2019

Я новичок с оракулом и подтипами обработки.Мне нужно выбрать альбом с MP3_TYPE и обоими значениями MEDIA_TYPE в DISK_TYPE: винил, аудио CD.

Вот запрос создания подтипа:

create or replace type disk_type under album_type 
( mediaType         varchar(10),
  diskNum           number(2), -- number of disks
  diskUsedPrice     number(9,2),
  diskDeliveryCost  number(9,2), 
  overriding member function discountPrice return number)
/
create or replace type mp3_type under album_type
(downloadSize   number, -- size in MB
overriding member function discountPrice return number)
/

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

Вот что я сделал:

select
    t1.albumtitle
from albums t1
where value(t1) IS OF (mp3_type) 
    and treat(value(t1) as disk_type).mediatype = 'Vinyl'
    and treat(value(t1) as disk_type).mediatype = 'Audio CD';

Есть идеи?

1 Ответ

1 голос
/ 24 сентября 2019

В приведенном выше коде mp3_type и disk_type являются подтипами album_type.Что кажется разумным.Но это означает, что один объект в таблице не может быть одновременно подтипами;поэтому он не может иметь атрибуты обоих подтипов.

Если строка mp3_type, то обработка ее как disk_type не приводит к установке атрибутов disk_type.Когда вы рассматриваете этот объект как disk_type, эти атрибуты будут - должен быть - нулевым.

insert into albums values (album_type('ABC'));
insert into albums values (mp3_type('BCD', 123));
insert into albums values (disk_type('DEF', 'Vinyl', 1, 12.34, 1.23));

select
    t1.albumtitle
from albums t1
where value(t1) IS OF (mp3_type) 
    and treat(value(t1) as disk_type).mediatype = 'Vinyl'
    and treat(value(t1) as disk_type).mediatype = 'Audio CD';

no rows selected

select
    t1.albumtitle,
    treat(value(t1) as disk_type).mediatype
from albums t1
where value(t1) IS OF (mp3_type);

ALBUMTITLE                     TREAT(VALU
------------------------------ ----------
BCD                                      

Мне нужно выбрать альбом, который имеет MP3_TYPE и оба значенияMEDIA_TYPE в DISK_TYPE: винил, аудио CD

Если это MP3_TYPE, тогда тип MEDIA равен нулю;но даже с записью disk_type тип носителя не может быть одновременно винил и CD одновременно.

Возможно, вы просто имели в виду или используете or вместо and:

select
    t1.albumtitle,
    treat(value(t1) as mp3_type).downloadsize as downloadsize,
    treat(value(t1) as disk_type).mediatype as mediatype
from albums t1
where
    value(t1) IS OF (mp3_type) 
    or (
        value(t1) IS OF (disk_type)
        and (
            treat(value(t1) as disk_type).mediatype = 'Vinyl'
            or treat(value(t1) as disk_type).mediatype = 'Audio CD'
        )
    );

ALBUMTITLE                     DOWNLOADSIZE MEDIATYPE 
------------------------------ ------------ ----------
BCD                                     123           
DEF                                         Vinyl     
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...