2017-09-03 3 views
2

に私はCorelatedサブクエリについての簡単な質問があります。次のようにオラクルALL SUBQUERY

テーブルとデータがある:

CREATE TABLE AUTHORS 
(
    NAME VARCHAR2(10 BYTE) 
); 

Insert into AUTHORS Values ('john'); 
Insert into AUTHORS Values ('bill'); 
Insert into AUTHORS Values ('dave'); 


CREATE TABLE BOOKS 
(
    NAME VARCHAR2(10 BYTE), 
    PRICE INTEGER 
); 


Insert into BOOKS Values ('john', 101); 
Insert into BOOKS Values ('john', 200); 
Insert into BOOKS Values ('john', 300); 
insert into books values ('bill', 200); 
Insert into BOOKS Values ('bill', 10); 
Insert into BOOKS Values ('dave', 5); 
COMMIT; 

質問:ここでの「ジョンは」> 100の価格ですべての書籍を持っています。

しかし、私は、クエリ、次を使用する場合、一列のみが返されます。

select * from 
    authors a 
    where 100 < all(select price from books b where a.nAME = b.NAME); 
+3

著者の表の中に1レコードしかありません. – Rams

+1

「JOHN」は価格が> 100のすべてのボックを持ち、次に「JOHN」のみが外部クエリ/演算子「100」によって取り出されます100が<10(10)以上であり、 'dave'の場合 - >' 100 (101,200,300)'が ' 100が5より小さくないのでALL(5) 'も偽です。クエリが返すべきと思いますか? – krokodilko

+0

@krokodilko - はい、すべての本が100を超える著者の表にはレコードしかありません。私はそれを見逃したようです。 – oradbanj

答えて

1

あなたはすべてのMAを取得したい場合あなたは価格が、これはそれを行う必要があります> 100であるジョンのためのすべての書籍を返すように求めている場合は、クエリの下

select * from 
    authors a join books c on a.name=c.name 
    where 100 < all(select price from books b where a.nAME = b.NAME); 
0

に動作します与えられた条件での本テーブルのレコードをtched。あなたは、最低価格が100以上である名前、ためすべての書籍をしたい場合は

SELECT * FROM authors a INNER JOIN books b ON a.name = b.name WHERE a.name = 'john' AND b.price > 100;

1

、私は単純にするだろう:あなたが名前だけを望んでいた場合、私は集約を使用する

select b.* 
from (select b.*, min(b.price) over (partition by b.name) as minprice 
     from books b 
    ) b 
where minprice > 100; 

select b.name 
from books b 
group by b.name 
having min(b.price) > 100; 

これらはどちらもあなたのアプローチよりも簡単です。