使用NULL作为一个占位符列将不会有任何输出:
SELECT pv.PropertyID,
COUNT(pv.VisitID) AS InitialVisit,
NULL AS jobvisit
FROM tblPAppointments pa
JOIN tblPropertyVisit pv ON pv.AppID = pa.AppID
WHERE pv.Status = 0
GROUP BY pv.PropertyID
UNION ALL
SELECT jv.PropertyID,
NULL AS initialvisit,
COUNT(jv.JobVistID) AS JobVisit
FROM tblPAppointments pa
JOIN tblJobVisits jv ON jv.AppID = pa.AppID
WHERE jv.VisitStatus = 1
GROUP BY jv.PropertyID
这将返回三列。列别名在第一个查询中是必需的,但不是在第二个查询中 - 我使用别名来明确发生了什么。
请注意,在SQL Server中如此使用NULL将需要您对NULL以外的数据类型使用NULL作为CAST/CONVERT,因为SQL Server将NULL数据类型默认为INT数据类型(就像那样奇怪)。
不使用UNION替代查询:
SELECT x.propertyid,
COUNT(y.visitid) AS initialvisit,
COUNT(z.jobvisitid) AS jobvisit
FROM (SELECT pv.propertyid
FROM TBLPROPERTYVISIT pv
WHERE EXISTS (SELECT NULL
FROM TBLAPPOINTMENTS a
WHERE a.appid = pv.appid)
UNION
SELECT jv.propertyid
FROM TBLJOBVISIT jv
WHERE EXISTS (SELECT NULL
FROM TBLAPPOINTMENTS a
WHERE a.appid = jv.appid)) x
LEFT JOIN TBLPROPERTYVISIT y ON y.propertyid = x.propertyid
LEFT JOIN TBLJOBVISIT z ON z.propertyid = x.propertyid
GROUP BY x.propertyid
这将只返回两个表中存在的propertyid值,否? JOIN可能会过滤出propertyid值... – 2011-03-11 05:51:22
@OMG小马:修正了两个... – gbn 2011-03-11 05:54:24
+1:我还添加了非UNION替代项 – 2011-03-11 05:59:19