2017-10-13 28 views
0

我试图得到一个查询返回一本书只有如果它不包含一个特定的流派,这种情况是浪漫小说。流派数据作为仅包含“流派”属性的Genre_Type的VARRAY插入。以下是如何插入示例数据。因为我相信它会返回,如果另一书有“演义”的流派之一什么如果值不存在,返回行VARRAY

INSERT INTO Book_Table 
VALUES(1, 'Assassin's Quest', 'A young boy is trained by his King to do his bidding', 
(Genre_Type(Genre_Book('Adventure'), Genre_Book('Drama'), 
Genre_Book('Fantasy')))) 

下面的查询返回的没有选择的行。

SELECT Title 
FROM Book_Table 
WHERE NOT EXISTS 
(SELECT g.* 
FROM Book_Table k, table(k.BookGenre) g 
WHERE g.Genre = 'Romance') 

我该如何解决这个问题?提前致谢。

回答

0

请问Book_Table有ID吗? 你可以尝试这样的查询:

SELECT bt1.Title 
FROM Book_Table bt1 
WHERE NOT EXISTS 
(SELECT g.* 
FROM Book_Table k, table(k.BookGenre) g 
WHERE g.Genre = 'Romance' and k.id = bt1.id) 
0

只是为了完整性:这是在like your previous question一个VARRAY超过嵌套表迫使你进入笨重语法的选择。使用嵌套表格,您可以使用更优雅的NOT MEMBER OF。

SQL> select * 
    2 from game_table g 
    3 where theme_game('FPS') not member of g.gametheme; 

TITLE     GAMETHEME(THEME) 
-------------------- ----------------------------------------- 
Uncharted 3   THEME_TYPE(THEME_GAME('Action'), THEME_GAME('Puzzle')) 
Commander Cody   THEME_TYPE(THEME_GAME('Fun'), THEME_GAME('Puzzle')) 

SQL> select * 
    2 from game_table g 
    3 where theme_game('Puzzle') not member of g.gametheme; 

TITLE     GAMETHEME(THEME) 
-------------------- ----------------------------------------- 
Star Wars    THEME_TYPE(THEME_GAME('Action'), THEME_GAME('FPS')) 

SQL> 

的VARRAY在嵌套表的唯一优点是VARRAY的顺序有保证:第一元件加入到VA将始终具有的VA(1)索引,第n个元素将始终具有的索引VA(n)。除非您需要订购功能,否则增加的灵活性和对其他操作员的支持使嵌套桌子成为更好的选择。

相关问题