如果行VARRAY中的值NOT EXISTS,则返回行

时间:2017-10-13 03:29:14

标签: sql oracle

如果它不包含特定类型,我正在尝试查询只返回 这个案例是浪漫小说。类型数据被插入为Genre_Type的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'))))

以下查询返回NO ROWS SELECTED因为我认为如果另一本书籍作为其中一个类型的“浪漫”,它将不会返回任何内容。

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

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

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分: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)。除非您需要这种排序功能,否则增加的灵活性和对其他运算符的支持使嵌套表成为更好的选择。