簡體   English   中英

在這里需要子查詢嗎SQL

[英]Is a sub query needed here SQL

我正在為學校做作業,但被卡住了。 我們目前正在研究子查詢。 但是我不確定這里是否需要一個。 我不是在尋找完整的答案,而只是在正確的思路上碰壁。

這是問題:

編寫SELECT語句,以返回具有唯一折扣百分比的每個品牌的名稱和折扣百分比。 換句話說,請勿包括折扣率與其他品牌相同的品牌。 按“品牌名稱”列對結果進行排序。

我知道我需要從Brands表中返回BrandName和BrandDiscountPercentage,但是這里需要子查詢嗎? 因此,為什么我不能只使用DISTINCT關鍵字。 我對SQL還是很陌生,所以我還在學習,但是我不確定為什么這里需要子查詢。

再次,不要尋找完整的答案,盡管如果您必須提供完整的解決方案,請至少解釋一下,以便我可以實際學習。

實現此目的的一種方法是group by BrandDiscountPercentage ,然后過濾出重復的值。 最簡單的方法就是逐步操作。

選擇所有查詢:

select 
   BrandName, 
   BrandDiscountPercentage 
from Brands

結果:

BrandName   BrandDiscountPercentage
A           1       
B           2
C           3
D           2

按BrandDiscountPercentage分組查詢:

select BrandDiscountPercentage, count(*)
from Brands
group by BrandDiscountPercentage

結果:

BrandDiscountPercentage     count(*)
1                           1
2                           2
3                           1   

過濾出非唯一的BrandDiscountPercentage查詢:

select BrandDiscountPercentage, count(*)
from Brands
group by BrandDiscountPercentage
having count(*) = 1

結果:

BrandDiscountPercentage     count(*)
1                           1
3                           1   

通過使用聚合函數查詢來包括BrandName:

select min(BrandName), BrandDiscountPercentage
from brands
group by BrandDiscountPercentage
having count(*) = 1
order by min(BrandName)

結果:

BrandName   BrandDiscountPercentage
A           1       
C           3   

您可以使用子查詢或自聯接來實現此目的。

  1. 您可以在子查詢中僅選擇不同的折扣百分比,然后檢索相應的品牌名稱

    SELECT品牌名稱,來自MyTable的DIS_PERCENT(1,DIS_PERCENT)在(SELECT count( ),來自MyTable GROUP的DIS_PERCENT,DIS_PERCENT擁有count( )= 1)

  2. 或者可以是相關的子查詢

    SELECT BRANDNAME,來自MyTable的DIS_PERCENT,m位置1 =(來自Mytable的SELECT count(*),其中DIS_PERCENT = m.DIS_PERCENT)

  3. 或自行加入

    從MyTable m,MyTABLE m1中選擇m.BRANDNAME,m.DIS_PERCENT,其中m.rowid <> m1.rowid和m.dis_percent <> m1.dis_percent

  4. 從表中選擇唯一名稱,Discount_percent這在這里不起作用,因為它將給出品牌和百分比的不同組合。 您的要求將無法滿足“不包括折扣率與其他品牌相同的品牌”。

DISTINCT是不正確的方法,因為它會一次返回數據中的所有值-即使它們重復。

但是,您實際上不需要此子查詢。 聚合查詢實際上有效:

select max(b.BrandName), BrandDiscountPercentage
from brands b
group by BrandDiscountPercentage
having min(b.BrandName) = max(b.BrandName);

這可以確定給定百分比是否存在多個名稱。 如果min()max()相同,則只有一個值。 Max(b.BrandName)返回該唯一值。

等效的having子句是:

having count(distinct b.BrandName) = 1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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