当SQL Server 2012中没有匹配的列时,如何从第一个表中获取所有列
我的要求是从当SQL Server 2012中没有匹配的列时,如何从第一个表中获取所有列,sql,sql-server,sql-server-2008,sql-server-2012,Sql,Sql Server,Sql Server 2008,Sql Server 2012,我的要求是从employees表中检索所有员工姓名,如果employees表中没有匹配的行,则员工姓名应与计数一起显示为0 CREATE TABLE #EMPLOYEES ( employeeId int, employeename varchar(50) ) INSERT INTO #EMPLOYEES VALUES (1,'Dinesh Alla') INSERT INTO #EMPLOYEES VALUES (2,'ram') INSERT INTO #EMPLOYEES
employees
表中检索所有员工姓名,如果employees
表中没有匹配的行,则员工姓名应与计数一起显示为0
CREATE TABLE #EMPLOYEES
(
employeeId int,
employeename varchar(50)
)
INSERT INTO #EMPLOYEES VALUES (1,'Dinesh Alla')
INSERT INTO #EMPLOYEES VALUES (2,'ram')
INSERT INTO #EMPLOYEES VALUES (3,'Lakshmi')
INSERT INTO #EMPLOYEES VALUES (4,'sumanth')
CREATE TABLE #LOGS
(
entityID int,
EntityCode int,
employeeID int
)
INSERT INTO #LOGS VALUES (1,201,1)
INSERT INTO #LOGS VALUES (1,201,1)
INSERT INTO #LOGS VALUES (1,201,1)
INSERT INTO #LOGS VALUES (1,201,1)
INSERT INTO #LOGS VALUES (1,201,1)
SELECT
te.employeeID, employeeName,
COUNT(ISNULL(entityCode, 0)) AS caseEntryCount
FROM
#EMPLOYEES Te
LEFT JOIN
#LOGS Tee ON ISNULL(TE.employeeID,0) = ISNULL(Tee.employeeID,0) --OR entityEmployeeID IS NULL
WHERE
entityCode = 201
GROUP BY
te.employeeID, employeename, entityCode
ORDER BY
employeeID
检查我的输出的下图
但我的预期产出是:
employeeID employeeName caseEntry
1 Dinesh Alla 5
2 ram 0
3 Lakshmi 0
4 sumanth 0
在join中不需要ISNULL,只需join,然后在WHERE子句中使用isnotnull。像这样的东西
SELECT te.employeeID
,employeeName
,COUNT(entityCode) AS caseEntryCount
FROM #EMPLOYEES Te
LEFT JOIN #LOGS Tee ON TE.employeeID = Tee.employeeID --OR entityEmployeeID IS NULL
WHERE entityCode = 201
OR entityCode IS NULL
GROUP BY te.employeeID
,employeename
,entityCode
ORDER BY employeeID
最好的做法是在所有字段上使用相关的表别名,而不仅仅是那些模棱两可的字段。这将使您的代码更加清晰易读。尝试以下方法:
SELECT te.employeeID, employeeName,
(SELECT COUNT(*) FROM #LOGS Tee
WHERE Te.employeeID = Tee.employeeID AND Tee.entityCode = 201) AS caseEntryCount
FROM #EMPLOYEES Te
ORDER BY Te.employeeID
您可以使用GROUP BY使用左外部联接重写查询,但比在选择列表字段中使用count子查询的主表上的简单查询要慢
SELECT e.*
, COUNT(l.entityID) AS CaseEntry
FROM #EMPLOYEES e
LEFT JOIN #LOGS l
ON l.employeeID = e.employeeId
GROUP BY e.employeeId
, e.employeename
, l.EntityCode
ORDER BY e.employeeId;
如果顺序无关紧要,尽量避免使用ORDER BY。这将为您提供更好的查询性能。为什么有两个标记sql-server-2008和sql-server-2012?是的,您是对的。我刚刚更新了应该满足您需要的代码。