2014-09-02 2 views
0

다른 값이 선택 카테고리 :SQL 항목이 나는 종류의 테이블이

CategoryID Description 
------------------------- 
1    Red category 
2    Green category 
3    Blue category 

그리고 아이템 테이블 :

ItemID CategoryID Status 
------------------------------ 
1   1    "New" 
2   1    "New" 
3   1    "New" 
4   2    "Editing" 
5   2    "Editing" 
6   2    "Editing" 
7   3    "Published" 
8   3    "Published" 
9   3    "Published" 

이 나는 ​​새로운 코드를 포팅하고 레거시 응용 프로그램에서 온다 베이스. Item 테이블의 Status 열이 실제로 Category 테이블에 있어야한다고 생각합니다. 같은 카테고리에 속하는 다른 아이템과 다른 상태를 가진 아이템이 없다는 것을 어떻게 확인할 수 있습니까?

는 내가 같은 카테고리 ID를 가지고있는 항목을 집계 할 알고, 그래서 시도 : 이것은 나에게 별개의 카테고리를 제공

select categoryid 
from item 
group by categoryid 

. 이제 두 개의 별개의 상태를 가진 것들을 선택하고 싶습니다.

select categoryid, count(status) > 1 
from item 
group by categoryid 
having count(status) > 1 

그러나 이것은 각 카테고리의 항목 수를 제공합니다. 나는 SQL에 끔찍하다.

+1

는 있습니다 .. 상품 ID를 생략하고 상태를 변화 모든 categoryids를 얻을 수 있습니다. –

+0

@samyi 나는 그것이 옳다고 생각하지 않는다. 위의 마지막 문장을 참조하십시오. –

답변

1
SELECT * 
FROM YourTable A 
WHERE EXISTS(SELECT 1 FROM YourTable 
      WHERE CategoryId = A.CategoryId 
      AND [Status] <> A.[Status]) 
+0

YourTable이란 무엇입니까? 목? –

+0

@Koveras 글쎄,'YourTable'은'item' 테이블입니다. 그것은 당신이'Category' 테이블을 가지고 있다고 말한 이래로 당신의 대답을 일반화하는 방법입니다 – Lamak

0
SELECT c.CategoryId, 
(SELECT COUNT(DISTINCT i.Status) FROM Item i WHERE i.CategoryId=c.CategoryId) 
FROM Category c 
0

@Koveras이 당신에게 여러 상태의 모든 범주를 제공 할 것입니다.

select categoryid 
from (
    select distinct categoryid, status 
    from item) t 
group by categoryid 
having count(*) > 1 

현재 받아 들여진 해결책은 효과가 있지만 효율성은 떨어집니다. 여기에 또 다른 해결책이 있습니다.

See Fiddle Here