[英]Mysql Select if row had value greater than
桌子PUBLISHER
PB_ID
桌子BOOK
BK_ID
, BK_PRICE
, PB_ID
1)我想獲取所有從未有過BK_PRICE > 10
發布者的列表
2)我想獲取所有BK_PRICE < 10
發布者的列表
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 );
您的第一個查詢
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
與使用聯接的其他響應不同,一旦發現價格大於或小於給定發布者的10,子查詢就可以早存在。 另外,由於出版商只需要將一本書上10本書以下即可將錯誤的結果歸入清單。 此外,由於沒有聯接,因此您不會使每本書的重復pub_ID大於或小於10,並且消除了對獨特書本的需求。
但是,如果您需要Book中的數據,則必須進行聯接,並且這種方法將行不通。 但就性能而言,假設對鍵進行正確索引,則此方法應該是最快的
因為我不清楚您是否需要一個或兩個數據集,所以我使用了“ union ALL”(不會執行不同的數據;因此對性能的影響較小),並添加了pubClass列來表示哪些發布者具有“ noBookPrice” > 10”和“ noBookPrice <10”的廣告
它使用一個相關的子查詢(請注意,在SUBquery中如何引用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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.