2017-09-03 124 views
2

我對Corelated子查詢簡單的問題:甲骨文都在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條記錄是你的1行你得到 – Rams

+1

只有'JOHN'包含所有價格> = 100的bocks,那麼只有'JOHN'被外部查詢/操作符'100對於John而言, 100 < ALL(5)'也是錯誤的,因爲100不小於5.你認爲查詢應該返回什麼? – krokodilko

+0

@ krokodilko - 是的,在作者表中只有所有書籍超過100的記錄。我似乎錯過了它。 – oradbanj

回答

1

如果你想獲得所有的馬tched記錄與下面接着給出的查詢條件書表將工作

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

如果你問返回所有書籍,約翰是那些價格> 100那麼這應該這樣做。

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

1

如果你希望所有的名字,這裏的最低價格大於100的書,我會簡單地做:

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; 

這兩個看起來比你的方法更簡單。