1

コンポーネントをカウントするために使用される次の SQL クエリがあります。

SELECT COUNT(CS.COMPONENTTYPEID) AS CNT
FROM COMPONENTTYPE CT LEFT
OUTER JOIN COMPONENTSTATS CS ON CS.COMPONENTTYPEID = CT.COMPONENTTYPEID
WHERE CT.COMPONENTTYPEID IN (?, ?)
GROUP BY CT.NAME,
         CT.COMPONENTTYPEID
ORDER BY CT.COMPONENTTYPEID

を持つすべてのコンポーネントを選択したいstatus = 'Active'。挿入する正しい位置はどこですか? 多分これ:

SELECT COUNT(CS.COMPONENTTYPEID) AS CNT
FROM COMPONENTTYPE CT LEFT
OUTER JOIN COMPONENTSTATS CS ON CS.COMPONENTTYPEID = CT.COMPONENTTYPEID
WHERE CT.COMPONENTTYPEID IN (?, ?) WHERE STATUS = 'Active'
GROUP BY CT.NAME,
         CT.COMPONENTTYPEID
ORDER BY CT.COMPONENTTYPEID
4

3 に答える 3

2
SELECT COUNT(CS.COMPONENTTYPEID) AS CNT
FROM COMPONENTTYPE CT 
    LEFT OUTER JOIN COMPONENTSTATS CS ON CS.COMPONENTTYPEID = CT.COMPONENTTYPEID AND CS.STATUS = 'Active'
WHERE CT.COMPONENTTYPEID IN (?, ?) 
GROUP BY CT.NAME, CT.COMPONENTTYPEID
ORDER BY CT.COMPONENTTYPEID

結合されたテーブルの結果セットを作成するために使用されるため、フィルターは結合句にある必要があります。

于 2013-03-06T19:34:35.273 に答える
2

複合where句が必要です。そうしないと、左の結合が無効になります..

SELECT COUNT(CS.COMPONENTTYPEID) AS CNT
FROM COMPONENTTYPE CT 
LEFT OUTER JOIN COMPONENTSTATS CS 
  ON CS.COMPONENTTYPEID = CT.COMPONENTTYPEID
WHERE CT.COMPONENTTYPEID IN (?, ?) and (STATUS = 'Active' or Status is null)
GROUP BY CT.NAME,
         CT.COMPONENTTYPEID
ORDER BY CT.COMPONENTTYPEID

または、結合自体に制限基準を設定する必要があります。

SELECT COUNT(CS.COMPONENTTYPEID) AS CNT
FROM COMPONENTTYPE CT 
LEFT OUTER JOIN COMPONENTSTATS CS 
  ON CS.COMPONENTTYPEID = CT.COMPONENTTYPEID
  AND (STATUS = 'Active')
WHERE CT.COMPONENTTYPEID IN (?, ?) 
GROUP BY CT.NAME,
         CT.COMPONENTTYPEID
ORDER BY CT.COMPONENTTYPEID
于 2013-03-06T19:35:16.860 に答える
1

STATUS列はテーブルにあるためCOMPONENTSTATS、クエリは次のようになります

SELECT COUNT(CS.COMPONENTTYPEID) AS CNT
FROM COMPONENTTYPE CT LEFT
OUTER JOIN COMPONENTSTATS CS ON CS.COMPONENTTYPEID = CT.COMPONENTTYPEID
WHERE CT.COMPONENTTYPEID IN (?, ?) AND CS.STATUS = 'Active'
GROUP BY CT.NAME,
         CT.COMPONENTTYPEID
ORDER BY CT.COMPONENTTYPEID
于 2013-03-06T19:35:17.910 に答える