仅检索匹配的 1 行的连接查询
Join query that only retrieves 1 rows matched
我有以下两个 table:
用户
- 用户 ID
- 姓名
- 类型
用户公司
- 公司编号
- 用户ID
公司
- 公司编号
- 姓名
我想要所有只有 1 个用户的类型 5 的公司。
为什么这个查询不起作用?
SELECT C.Name FROM USER u
JOIN UserCompany UC on u.UserID = UC.UserID
JOIN Company C on uc.companyID = c.companyID
WHERE u.Type = 5
GROUP BY u.name
HAVING COUNT(u.name) = 1
样本数据
用户Table:
1 John 1
2 Beth 2
3 Mike 5
4 John 5
公司table:
1 XYZ
2 KBC
3 MMM
用户公司
1 1
1 3
1 4
2 3
2 1
=> 应返回公司 2,因为它只有 1 个类型为 5 的用户
我只想更新 HAVING
子句:
SELECT UC.companyID
FROM USER u JOIN
UserCompany UC
ON u.UserID = UC.UserID JOIN
Company C
ON uc.companyID = c.companyID
GROUP BY UC.companyID
HAVING SUM(CASE WHEN U.TYPE = 5 THEN 1 ELSE 0 END) = 1;
好的,所以我重新创建了您的示例 tables,以便我们可以在 SSMS 中使用它们;
IF OBJECT_ID('tempdb..#User') IS NOT NULL DROP TABLE #User
CREATE TABLE #User (UserID int, Name nvarchar(4), Type int)
INSERT INTO #User (UserID, Name, Type)
VALUES
(1,'John',1)
,(2,'Beth',2)
,(3,'Mike',5)
,(4,'John',5)
IF OBJECT_ID('tempdb..#Company') IS NOT NULL DROP TABLE #Company
CREATE TABLE #Company (CompanyID int, Name nvarchar(3))
INSERT INTO #Company (CompanyID, Name)
VALUES
(1,'XYZ')
,(2,'KBC')
,(3,'MMM')
我不得不猜测您的专栏 headers,因为它们不在示例数据中。这很有趣,因为我猜测 table UserCompany
的 UserID 和 CompanyID 与标题的顺序相同。当我查看它时,它表明您的数据中根本没有用户 3。出于此目的,我假设它实际上是 CompanyID 和 UserID 的顺序。
IF OBJECT_ID('tempdb..#UserCompany') IS NOT NULL DROP TABLE #UserCompany
CREATE TABLE #UserCompany (CompanyID int, UserID int)
INSERT INTO #UserCompany (CompanyID, UserID)
VALUES
(1,1)
,(1,3)
,(1,4)
,(2,3)
,(2,1)
假设这是正确的,你会想做这样的事情;
SELECT
c.Name AS Company_Name
,COUNT(u.UserID) Employees
FROM #Company c
INNER JOIN #UserCompany uc
ON c.CompanyID = uc.CompanyID
INNER JOIN #User u
ON uc.UserID = u.UserID
AND u.Type = 5
GROUP BY c.Name
HAVING Count(u.UserID) > 1
这会给你输出;
Company_Name Employees
XYZ 2
我有以下两个 table:
用户
- 用户 ID
- 姓名
- 类型
用户公司
- 公司编号
- 用户ID
公司
- 公司编号
- 姓名
我想要所有只有 1 个用户的类型 5 的公司。
为什么这个查询不起作用?
SELECT C.Name FROM USER u
JOIN UserCompany UC on u.UserID = UC.UserID
JOIN Company C on uc.companyID = c.companyID
WHERE u.Type = 5
GROUP BY u.name
HAVING COUNT(u.name) = 1
样本数据
用户Table:
1 John 1
2 Beth 2
3 Mike 5
4 John 5
公司table:
1 XYZ
2 KBC
3 MMM
用户公司
1 1
1 3
1 4
2 3
2 1
=> 应返回公司 2,因为它只有 1 个类型为 5 的用户
我只想更新 HAVING
子句:
SELECT UC.companyID
FROM USER u JOIN
UserCompany UC
ON u.UserID = UC.UserID JOIN
Company C
ON uc.companyID = c.companyID
GROUP BY UC.companyID
HAVING SUM(CASE WHEN U.TYPE = 5 THEN 1 ELSE 0 END) = 1;
好的,所以我重新创建了您的示例 tables,以便我们可以在 SSMS 中使用它们;
IF OBJECT_ID('tempdb..#User') IS NOT NULL DROP TABLE #User
CREATE TABLE #User (UserID int, Name nvarchar(4), Type int)
INSERT INTO #User (UserID, Name, Type)
VALUES
(1,'John',1)
,(2,'Beth',2)
,(3,'Mike',5)
,(4,'John',5)
IF OBJECT_ID('tempdb..#Company') IS NOT NULL DROP TABLE #Company
CREATE TABLE #Company (CompanyID int, Name nvarchar(3))
INSERT INTO #Company (CompanyID, Name)
VALUES
(1,'XYZ')
,(2,'KBC')
,(3,'MMM')
我不得不猜测您的专栏 headers,因为它们不在示例数据中。这很有趣,因为我猜测 table UserCompany
的 UserID 和 CompanyID 与标题的顺序相同。当我查看它时,它表明您的数据中根本没有用户 3。出于此目的,我假设它实际上是 CompanyID 和 UserID 的顺序。
IF OBJECT_ID('tempdb..#UserCompany') IS NOT NULL DROP TABLE #UserCompany
CREATE TABLE #UserCompany (CompanyID int, UserID int)
INSERT INTO #UserCompany (CompanyID, UserID)
VALUES
(1,1)
,(1,3)
,(1,4)
,(2,3)
,(2,1)
假设这是正确的,你会想做这样的事情;
SELECT
c.Name AS Company_Name
,COUNT(u.UserID) Employees
FROM #Company c
INNER JOIN #UserCompany uc
ON c.CompanyID = uc.CompanyID
INNER JOIN #User u
ON uc.UserID = u.UserID
AND u.Type = 5
GROUP BY c.Name
HAVING Count(u.UserID) > 1
这会给你输出;
Company_Name Employees
XYZ 2