2017-10-13 16 views
0

特定のジャンルが含まれていない場合は、のみを返すクエリを取得しようとしています。このケースはロマンス小説です。ジャンルデータは、 'Genre'属性のみを含む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

ただ、完全性について:これは不格好な構文にネストした表の力以上のVARRAYの選択あなたという点でlike your previous questionある は、次のようなクエリを試すことができます。ネストされたテーブルを使用すると、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(1)のインデックスを有するであろうVAに添加し、n番目の要素は常にインデックスを有するであろうVA(n)。オーダー機能が必要な場合を除いて、追加の演算子の柔軟性とサポートの強化により、ネストした表がより良い選択になります。

関連する問題