2011-04-30 80 views
0

我想選擇所有記錄,但查詢只返回每個產品名稱的單個記錄。我的表看起來類似於:有唯一SQL查詢的問題

SellId ProductName Comment 
1   Cake  dasd 
2   Cake  dasdasd 
3   Bread  dasdasdd 

產品名稱不唯一。我想查詢返回每個產品名稱的單個記錄有類似的結果:

SellId ProductName Comment 
1   Cake  dasd 
3   Bread  dasdasdd 

我已經試過此查詢,

Select distict ProductName,Comment ,SellId from TBL#Sells 

但具有相同產品名稱返回多個記錄。我的表並不像這樣簡單,這只是一個示例。解決辦法是什麼?清楚嗎?

+0

你的代碼的目標是什麼?你想做什麼? – richard 2011-04-30 07:36:47

+0

如果您對蛋糕有不止一個評論,您想要在評論欄中看到爲蛋糕返回的單行內容,您會看到什麼? – 2011-04-30 07:40:58

+0

我想選擇所有記錄,但任何產品名稱都不要在查詢中重複 – Saleh 2011-04-30 07:41:20

回答

2
Select ProductName, 
min(Comment) , min(SellId) from TBL#Sells 
group by ProductName 

如果您只希望每個產品名稱有一條記錄,您當然必須爲其他字段選擇您想要的值。

如果您彙總(使用GROUP BY),你可以選擇一個aggregate function, htat這麼取值的列表,只有一個返回的功能:在這裏我選擇MIN:這是每個字段的最小walue。

注意:評論和sellid可以來自不同的記載,自MIN取...

Othter聚集可能對您有用:

FIRST : first record encountered 
LAST : last record encoutered 
AVG : average 
COUNT : number of records 

第一/最後的優點在於,所有字段都是來自同一記錄。

+0

我覺得他想要'min'而不是。 – leppie 2011-04-30 07:39:47

+0

@leppie,確實,相應地改變了它,tx – Peter 2011-04-30 07:43:50

+0

謝謝,我得到了我的答案。「Muchas Gracias」 – Saleh 2011-04-30 07:51:49

2
SELECT S.ProductName, S.Comment, S.SellId 
FROM 
    Sells S 
    JOIN (SELECT MAX(SellId) 
     FROM Sells 
     GROUP BY ProductName) AS TopSell ON TopSell.SellId = S.SellId 

這將得到最新的評論作爲您選擇的評論假設SellId是一個自動遞增的身份上升。

+0

謝謝,我得到了我的答案。「Muchas Gracias」 – Saleh 2011-04-30 07:52:24

+0

我們不應該在產品名稱加入? – Beatles1692 2011-04-30 09:12:56

+0

不,因爲我已經在子查詢中爲每個名稱獲得了1個id。子查詢按產品名稱獲取最新條目,第1部分獲取其餘的詳細信息。 – Gats 2011-04-30 09:16:02

0

我知道,你已經有了答案,我想提供一種在性能方面最快的方式,在類似的情況下。我假設SellId是主鍵和標識。您需要在ProductName上使用索引以獲得最佳性能。

select 
    Sells.* 
from 
(
    select 
     distinct ProductName 
    from 
     Sells 
) x 
join 
    Sells 
on 
    Sells.ProductName = x.ProductName 
    and Sells.SellId = 
    (
     select 
      top 1 s2.SellId 
     from 
      Sells s2 
     where 
      x.ProductName = s2.ProductName 
     Order By SellId 
    ) 

較慢的方法,(但比GROUP BY和MIN在長炭柱猶更好)是這樣的:

select 
    * 
from 
(
    select 
     *,ROW_NUMBER() over (PARTITION BY ProductName order by SellId) OccurenceId 
    from sells 
) x 
where 
    OccurenceId = 1 

這一塊的優點是,它更容易閱讀。

0
create table Sale 
(
    SaleId int not null 
     constraint PK_Sale primary key, 
    ProductName varchar(100) not null, 
    Comment varchar(100) not null 
) 

insert Sale 
values 
    (1, 'Cake', 'dasd'), 
    (2, 'Cake', 'dasdasd'), 
    (3, 'Bread', 'dasdasdd') 

-- Option #1 with over() 
select * 
from Sale 
where SaleId in 
(
    select SaleId 
    from 
    (
     select SaleId, row_number() over(partition by ProductName order by SaleId) RowNumber 
     from Sale 
    ) tt 
    where RowNumber = 1 
) 
order by SaleId 

-- Option #2 
select * 
from Sale 
where SaleId in 
(
    select min(SaleId) 
    from Sale 
    group by ProductName 
)  
order by SaleId 

drop table Sale