在 Oracle 中检索对象
Retrieve objects in Oracle
我有一个名为 Menu
的 Oracle 对象,它有一个对象类型作为属性。
菜单类型
Create Type Menu as Object(
beer REF beertype,
price float
)
啤酒类型
Create Type beertype as object(
name char(20),
seller char(20)
)
table 使用菜单类型创建
Create table Sells of Menu
table 使用 beertype
创建
Create table beer of beertype
现在我想做的是编写一个 select 查询来检索价格超过 3.5 的啤酒的名称。
我试过了
SELECT beer.name
FROM Sells;
和
SELECT Sells.beer.name
FROM Sells;
这是一个例子:首先测试用例:
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
您不需要使用 JOIN
来获取名称;您可以只使用 DEREF
或在 SELECT
子句中链接 reference/attribute 名称:
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<>fiddle here
我有一个名为 Menu
的 Oracle 对象,它有一个对象类型作为属性。
菜单类型
Create Type Menu as Object(
beer REF beertype,
price float
)
啤酒类型
Create Type beertype as object(
name char(20),
seller char(20)
)
table 使用菜单类型创建
Create table Sells of Menu
table 使用 beertype
创建Create table beer of beertype
现在我想做的是编写一个 select 查询来检索价格超过 3.5 的啤酒的名称。
我试过了
SELECT beer.name
FROM Sells;
和
SELECT Sells.beer.name
FROM Sells;
这是一个例子:首先测试用例:
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
您不需要使用 JOIN
来获取名称;您可以只使用 DEREF
或在 SELECT
子句中链接 reference/attribute 名称:
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<>fiddle here