我有一个名为Menu
的Oracle对象,该对象具有一个对象类型作为属性。
菜单类型
Create Type Menu as Object(
beer REF beertype,
price float
)
啤酒类型
Create Type beertype as object(
name char(20),
seller char(20)
)
使用菜单类型创建的表
Create table Sells of Menu
使用啤酒类型创建的表
Create table beer of beertype
现在我想做的是编写一个选择查询,以检索价格超过3.5的啤酒的名称。
我尝试过
SELECT beer.name
FROM Sells;
和
SELECT Sells.beer.name
FROM Sells;
答案 0 :(得分:1)
这里是一个例子:首先是测试用例:
SQL> create type beertype as object(
2 name char(20),
3 seller char(20)
4 );
5 /
Type created.
SQL> create type menu as object(
2 beer ref beertype,
3 price float
4 );
5 /
Type created.
SQL> create table sells of menu;
Table created.
SQL> create table beer of beertype;
Table created.
SQL> insert into beer (name, seller) values ('Heineken', 'KTC');
1 row created.
SQL> insert into beer (name, seller) values ('Tuborg', 'Plodine');
1 row created.
SQL> insert into sells (beer, price) values ((select ref(b) from beer b where name = 'Heineken'), 10);
1 row created.
SQL> insert into sells (beer, price) values ((select ref(b) from beer b where name = 'Tuborg'), 2.5);
1 row created.
查询以选择价格大于3.5的啤酒名称:
SQL> select b.name, s.price
2 from sells s join beer b on value(b) = deref(s.beer)
3 where s.price > 3.5;
NAME PRICE
-------------------- ----------
Heineken 10
SQL>
如果您想了解更多信息,这是一篇不错的文章:Using REF Values for Retrieval of Data Values
答案 1 :(得分:0)
您不需要使用JOIN
来获取名称;您可以只使用DEREF
或在SELECT
子句中链接引用/属性名称:
select DEREF(s.beer).name AS name, s.price
from sells s
where s.price > 3.5;
或
select s.beer.name AS name, s.price
from sells s
where s.price > 3.5;
(第一个选项清楚表明您正在取消引用REF
,而第二个选项更简洁。)
哪个输出:
NAME | PRICE :------------------- | ----: Heineken | 10
db <>提琴here