当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?是的,您是对的。我刚刚更新了应该满足您需要的代码。