表PUBLISHER
PB_ID
表BOOK
BK_ID
,BK_PRICE
,PB_ID
1)我想获得所有从未有BK_PRICE > 10
2)我想获得所有从未有BK_PRICE < 10
答案 0 :(得分:1)
SELECT PB_ID
FROM PUBLISHER
WHERE PB_ID NOT IN (
SELECT DISTINCT PB_ID
FROM BOOK
WHERE BK_PRICE >= 10 );
SELECT PB_ID
FROM PUBLISHER
WHERE PB_ID NOT IN (
SELECT DISTINCT PB_ID
FROM BOOK
WHERE BK_PRICE <= 10 );
答案 1 :(得分:1)
您的第一个查询
Select P.PB_ID from PUBLISHER P join BOOK B on P.PB_ID = B.PB_ID where B.BK_PRICE > 10
您的第二个查询
Select P.PB_ID from PUBLISHER P join BOOK B on P.PB_ID = B.PB_ID where B.BK_PRICE < 10
答案 2 :(得分:1)
与使用联接的其他响应不同,一旦发现价格> 1,这可以提前存在子查询。或者&lt;比给定出版商的10个。此外,每个其他回复都会给你错误的结果,因为出版商只需要一本高于或低于10的书就可以列入名单。 此外,由于没有连接,因此您不会为每本书重复多次或少于10次的pub_ID,并且不需要明确的。
但是,如果您需要Book中的数据,则需要加入,这种方法不起作用。但就性能而言,假设对键进行适当的索引,这种方法应该是最快的
由于我不清楚你是否想要一个或两个数据集,我使用了'union ALL'(它没有执行一个独特的;因此性能较低)结果并添加了一个pubClass列来表示哪些发布者有'noBookPrice&gt; 10'和那些'noBookPrice&lt; 10'
这使用了一个相关的子查询(请注意在子查询中如何引用P.?子查询如何知道P?(这是很酷的子查询,只能是一级深度)来组合{P}列表以及{b}的结果,以确保发布商不会出现一次图书价格> 10或<10。
SELECT P.Pub_ID, 'NoBookPrice>10' as PubClass
FROM Publisher P
WHERE not exists (SELECT 1
FROM Book B
WHERE BK_PRICE > 10
and B.PB_ID = P.Pub_ID)
UNION ALL
SELECT Pub_ID, 'NoBookPrice<10' as PubClass
FROM Publisher P
WHERE not exists (SELECT 1
FROM Book B
WHERE BK_PRICE < 10
and B.PB_ID = P.Pub_ID)