0

以下のようなSQLクエリがあります。where 部分で必要なのは、SiteId に関係なく、CategorySite が ProductCategory で一致する categoryid を持つ行を 3 つ以上返す行を返さないことです。問題は、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

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 に答える
0

したがって、最初のソリューションを使用してこれを行うことができましたが、問題は別の場所にあることがわかりました。とにかくありがとう!:)

于 2013-08-01T09:19:20.027 に答える