Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在一个查询中选择不同的子类型值_Sql_Oracle_Subtype - Fatal编程技术网

Sql 在一个查询中选择不同的子类型值

Sql 在一个查询中选择不同的子类型值,sql,oracle,subtype,Sql,Oracle,Subtype,我不熟悉oracle和处理子类型。我需要选择一个MP3类型的相册,以及磁盘类型中媒体类型的两个值:乙烯基、音频CD 以下是创建子类型查询: create or replace type disk_type under album_type ( mediaType varchar(10), diskNum number(2), -- number of disks diskUsedPrice number(9,2), diskDeliver

我不熟悉oracle和处理子类型。我需要选择一个MP3类型的相册,以及磁盘类型中媒体类型的两个值:乙烯基、音频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种类型都在一个查询中时,它似乎不起作用。treat函数不是很好,所以假设它是一些语法问题

以下是我所做的:

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';

有什么想法吗?

在您目前展示的代码中,
mp3\u类型
disk\u类型
都是
album\u类型
的子类型。这似乎是合理的。但这意味着表中的单个对象不能同时是两个子类型;所以它不能同时具有两个子类型的属性

如果行是
mp3\u类型
,则将其视为
disk\u类型
不会导致设置
disk\u类型
属性。当您将该对象视为
disk\u 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类型的相册,以及磁盘类型中媒体类型的两个值:乙烯基、音频CD

如果是MP3_类型,则媒体类型为空;但即使使用
磁盘类型
条目,介质类型也不能同时为乙烯基和CD

也许您只是指或使用
而不是

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     

该SQL语句看起来不像Oracle语法。您确定已经标记了正确的数据库平台吗?oracle sql developer已被告知它是sameHmm。看起来它可能是有效的语法,但我以前从未遇到过!(我从来没有以这种方式使用过对象。)那么,您正在PL/SQL中使用此SQL?是的,这是正确的,有什么想法吗?请编辑您的问题以包括albums表的DDL。