SQL中子查询未按预期过滤的情况

时间:2013-07-16 09:58:00

标签: sql where

我有一个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

3 个答案:

答案 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)

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