簡體   English   中英

Mysql選擇行的值是否大於

[英]Mysql Select if row had value greater than

桌子PUBLISHER

PB_ID

桌子BOOK

BK_IDBK_PRICEPB_ID

1)我想獲取所有從未有過BK_PRICE > 10發布者的列表

2)我想獲取所有BK_PRICE < 10發布者的列表

1個

SELECT PB_ID
     FROM PUBLISHER
    WHERE PB_ID NOT IN (
    SELECT DISTINCT PB_ID  
      FROM BOOK        
    WHERE BK_PRICE >= 10 );

2

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM