0

我有一个如下的 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
4

3 回答 3

0

所以我能够使用我的初始解决方案来做到这一点,结果问题出在其他地方。不管怎么说,还是要谢谢你!:)

于 2013-08-01T09:19:20.027 回答
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
于 2013-07-16T10:57:10.280 回答
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)。两者都支持窗口功能。

于 2013-07-16T11:03:57.970 回答