我有一个SQL查询,如下所示。我想要的where部分是结果不返回的行,其中CategorySite返回两行以及ProductCategory中匹配的categoryid,而不管SiteId。问题是我知道ProductCategory对于我收到的一些结果有多个匹配的类别,所以我的查询有问题,我无法弄清楚是什么。
select top 10 pp.*
from ProductProperty pp
inner join ProductCategory pc on pp.fkProductId = pc.fkProductId and pp.fkLocaleId = 1
inner join CategorySite cs on pc.fkCategoryId = cs.fkCategoryId and cs.fkSiteId = 2
inner join CategoryProperty cp on cs.fkCategoryId = cp.fkCategoryId and cp.fkLocaleId=1
where (select count(*) from CategorySite css where pc.fkCategoryId = css.fkCategoryId) = 1
答案 0 :(得分:0)
如果你不在谓词中使用它,为什么要加入CategoryProperty
?
试试这个。如果您需要CategoryProperty,请尝试在最后添加
;WITH InsteadOfWhere AS
(
SELECT fkCategoryId
FROM CategorySite
GROUP BY fkCategoryId
HAVING COUNT(fkCategoryId) = 1
)
SELECT TOP 10 *
FROM ProductProperty pp
inner join ProductCategory pc on pp.fkProductId = pc.fkProductId and pp.fkLocaleId = 1
INNER JOIN InsteadOfWhere ON InsteadOfWhere.fkCategoryID = pc.fkCategoryId
inner join CategorySite cs on InsteadOfWhere.fkCategoryId = cs.fkCategoryId and cs.fkSiteId = 2
答案 1 :(得分:0)
一个很好的方法是窗口函数。您可以在子查询中计算计数,然后执行所需的选择:
select t.*
from (select pp.*,
count(*) over (partition by pc.fkCategoryId) as cnt
from ProductProperty pp
inner join ProductCategory pc on pp.fkProductId = pc.fkProductId and pp.fkLocaleId = 1
inner join CategorySite cs on pc.fkCategoryId = cs.fkCategoryId and cs.fkSiteId = 2
inner join CategoryProperty cp on cs.fkCategoryId = cp.fkCategoryId and cp.fkLocaleId=1
) t
where cnt = 1;
我假设数据库是基于语法的SQL Server(或可能是Sybase)。两者都支持窗口功能。
答案 2 :(得分:0)
所以我能够使用我的初始解决方案做到这一点,事实证明问题出在其他地方。不管怎么说,还是要谢谢你! :)