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

你要么需要一个复合 whereclause,否则你的左连接无效。

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 回答