2011-04-30 6 views
0

모든 레코드를 선택하고 싶지만 쿼리는 제품 이름 당 하나의 레코드 만 반환해야합니다. 내 표는 다음과 유사합니다.고유 한 SQL 쿼리의 문제

여기서 제품 이름은 고유하지 않습니다. 나는 쿼리와 같은 결과를 제품 이름 당 하나의 레코드를 반환 할 :

SellId ProductName Comment 
1   Cake  dasd 
3   Bread  dasdasdd 

내가이 쿼리를 시도했다

Select distict ProductName,Comment ,SellId from TBL#Sells 

하지만 같은 제품 이름으로 여러 레코드를 반환합니다. 내 테이블은 이것처럼 단순하지 않습니다. 이것은 단지 샘플 일뿐입니다. 해결 방안은 무엇인가? 명백합니까?

+0

코드의 목적은 무엇입니까? 너 뭐하려고? – richard

+0

cake에 대해 하나 이상의 주석이 주어지면 cake에 대해 반환되는 단일 행에 대한 주석 열에 무엇을 표시하겠습니까? –

+0

모든 레코드를 선택하고 싶지만 쿼리에서 반복하지 않는 모든 제품 이름 – Saleh

답변

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

제품 이름 당 하나의 레코드 만 있으면 다른 필드에 대해 원하는 값을 선택해야합니다.

당신이 집계하는 경우 선택할 수 있습니다 (그룹화를 사용하여) 값들의리스트를 받아서 하나를 반환 함수의 htat aggregate function, : 여기에 내가 MIN 선택했다 : 즉, 각 필드의 작은 walue입니다.

참고 : MIN 촬영 때문에 코멘트와 sellid는 다른 기록에서 올 수 ...

Othter 당신이 유용 할 수 집계 :

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

첫번째/마지막으로 모든 필드는 장점이있다 같은 기록에서.

+0

나는 그가 "min"을 원한다고 생각한다. – leppie

+0

@leppie, 실제로, 그에 따라 변경, tx – Peter

+0

고마워, 나는 내 대답을 얻었다."Muchas Gracias" – Saleh

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가 올라가는 자동 증가 ID 인 것으로 가정하면 선택한 댓글의 최신 댓글을 받게됩니다.

+0

감사합니다. 내 대답이 있습니다. "Muchas Gracias" – Saleh

+0

제품 이름을 가입에 포함하지 않아야합니까? – Beatles1692

+0

아니요 이미 서브 쿼리에 이름 당 1 개의 ID가 있기 때문입니다. 하위 쿼리는 제품 이름별로 최신 항목을 가져오고 첫 번째 부분은 나머지 세부 정보를 가져옵니다. – Gats

0

나는 이미 비슷한 대답을 얻었으므로, 비슷한 상황에서 나를 위해 성능면에서 가장 빠른 방법을 제시하고자합니다. 나는 SellId가 기본 키와 신원이라고 가정하고 있습니다. 최상의 성능을 위해 ProductName에 대한 인덱스가 필요합니다.

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

이 하나의 장점은 훨씬 더 쉽게 읽을 수 있다는 것입니다 :

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 
    ) 

느린 방법은, (그러나 긴 문자 열에 그룹에 의해 MIN보다 여전히 더 나은)이있다.

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