你可以使用一个集合,然后比较使用SUBMULTISET
操作多个项目:
SQL Fiddle
的Oracle 11g R2架构设置:
CREATE OR REPLACE TYPE Theme_Game AS OBJECT
(Theme VARCHAR(20));
/
CREATE OR REPLACE TYPE Theme_Type AS TABLE OF Theme_Game;
/
CREATE OR REPLACE TYPE Game_Type AS OBJECT(
Title VARCHAR2(50),
GameTheme Theme_Type
);
/
CREATE TABLE Game_Table of Game_Type
NESTED TABLE GameTheme STORE AS GameTheme_Tab
/
INSERT INTO Game_Table
VALUES('Star Wars' ,(Theme_Type(Theme_Game('Action'), Theme_Game('FPS'))))
/
查询1:
SELECT *
FROM game_table
WHERE Theme_Type(Theme_Game('Action'), Theme_Game('FPS'))
SUBMULTISET OF GameTheme
Results:
| TITLE | GAMETHEME |
|-----------|-------------------------------------------------------|
| Star Wars | [email protected],[email protected] |
然而,为什么为Y ou使用Theme_Game
对象时,它只有一个VARCHAR2
属性?你可以只使用一个VARRAY(3) OF VARCHAR2(20)
或TABLE OF VARCHAR2(20)
没有中间对象:
SQL Fiddle
的Oracle 11g R2架构设置:
CREATE OR REPLACE TYPE Varchar20List AS TABLE OF VARCHAR2(20);
/
CREATE OR REPLACE TYPE Game_Type AS OBJECT(
Title VARCHAR2(50),
GameTheme Varchar20List
);
/
CREATE TABLE Game_Table of Game_Type
NESTED TABLE GameTheme STORE AS GameTheme_Tab
/
INSERT INTO Game_Table
VALUES('Star Wars' , Varchar20List('Action', 'FPS'))
/
查询1:
SELECT *
FROM game_table
WHERE Varchar20List('Action','FPS')
SUBMULTISET OF GameTheme
Results:
| TITLE | GAMETHEME |
|-----------|------------|
| Star Wars | Action,FPS |
如果你想与VARRAY
s到做到这一点,那么:
SQL Fiddle
的Oracle 11g R2架构设置:
CREATE OR REPLACE TYPE Varchar20List AS VARRAY(3) OF VARCHAR2(20);
/
CREATE OR REPLACE TYPE Game_Type AS OBJECT(
Title VARCHAR2(50),
GameTheme Varchar20List
);
/
CREATE TABLE Game_Table of Game_Type
/
INSERT INTO Game_Table
VALUES('Star Wars' , Varchar20List('Action', 'FPS'))
/
查询1 :
SELECT *
FROM game_table g
WHERE 2 >= (SELECT COUNT(*)
FROM TABLE(g.GameTheme) a
INNER JOIN
TABLE(Varchar20List('Action', 'FPS')) b
ON (a.COLUMN_VALUE = b.COLUMN_VALUE)
)
Results:
| TITLE | GAMETHEME |
|-----------|------------|
| Star Wars | Action,FPS |
或:
查询2:
SELECT *
FROM game_table g
WHERE 2 >= (SELECT COUNT(*)
FROM TABLE(g.GameTheme) a
WHERE a.COLUMN_VALUE IN ('Action', 'FPS')
)
Results :
| TITLE | GAMETHEME |
|-----------|------------|
| Star Wars | Action,FPS |
这个声明是有效的,但是如果我然后需要检索具有多个主题的行,例如Action,FPS呢? – lesovren
@APC如果他需要有两个主题的标题,他将无济于事。然后使用'intersect'。 –
我试图在这种情况下使用'AND'我试图检索既是行动和FPS行,但它不返回任何行。 – lesovren