SQL选择项目具有不同值的类别

时间:2014-09-02 19:31:32

标签: sql sql-server

我有一个分类表:

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表上。如何验证没有项目的状态与属于同一类别的任何其他项目不同?

我知道我想要聚合具有相同CategoryID的Items,所以我尝试了:

select categoryid
from item
group by categoryid

这给了我不同的类别。现在我想选择具有两个不同状态的那些:

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

但这只是给了我每个类别中的项目数量。我在SQL上很糟糕。

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

@Koveras,这将为您提供具有多种状态的所有类别。

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

您当前接受的解决方案可行,但效率会降低。这是另一种解决方案。

See Fiddle Here