我有一个分类表:
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上很糟糕。
答案 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
您当前接受的解决方案可行,但效率会降低。这是另一种解决方案。