tsql - 我需要帮助识别在另一个表中具有不同状态的表成员组
问题描述
我无法通过谷歌搜索来解决这个问题。我对 TSQL 还是很陌生,我想我可以通过自连接和子查询来解决这个问题。但我得到了很多结果,不知道如何驯服它们。我很感激帮助。很高兴看到人们针对同一问题提出的所有不同方法。我知道我在尝试解决问题时会得到隧道视野,最好从不同的角度尝试。
我的目标是这个。我想返回 PersonID 的 HairColor 不完全匹配的所有家庭的家庭 ID。不管是什么颜色。所以低于 HouseHoldID 200 将返回,因为他们的 PersonID 的 HairColor 彼此不同。不像 HouseHoldID 300,其 PersonID 的 HairColor 确实相互匹配。
HouseholdMember
+------------+-----------------+-----------+
| MemberID | HouseholdID | PersonID |
+------------+-----------------+-----------+
| 100 | 200 | 1 |
| 101 | 200 | 2 |
| 102 | 200 | 3 |
| 103 | 300 | 4 |
| 104 | 300 | 5 |
| 105 | 300 | 6 |
+------------+-----------------+-----------+
Person
+------------+-----------------+-----------+------------+
| PersonID | FirstName | LastName | HairColor |
+------------+-----------------+-----------+------------+
| 1 | Josh | Smith | Brown |
| 2 | Jerry | Smith | Black |
| 3 | Ethan | Smith | Red |
| 4 | Mike | Jones | Black |
| 5 | Devan | Jones | Black |
| 6 | Todd | Jones | Black |
+------------+-----------------+-----------+------------+
Household
+---------------+-----------------+----------------+
| HouseholdID | Name | Address |
+---------------+-----------------+----------------+
| 200 | Smith's | 123 Candy Dr |
| 300 | Jones's | 812 Dentist Ln |
+---------------+-----------------+----------------+
解决方案
一种选择使用聚合:
WITH cte AS (
SELECT hm.HouseholdID
FROM HouseholdMember hm
INNER JOIN Person p ON hm.PersonID = p.PersonID
GROUP BY hm.HouseholdID
HAVING COUNT(DISTINCT p.HairColor) > 1
)
SELECT *
FROM Household
WHERE HouseholdID IN (SELECT HouseholdID FROM cte);
演示
推荐阅读
- amazon-web-services - machineType和mixedInstancesPolicy有什么区别
- vba - 如何使 VBA 输入框仅在用户输入带有 3 个数字和“M”和“!”的 7 个字符的代码时才会消失
- amazon-web-services - zappa {"message":"Forbidden"} 使用烧瓶
- r - 重新组合/重新分配原始数据
- php - 旧的 php 容器说: curl:(60)SSL 证书问题:证书已过期
- xml - 一次删除属性和匹配的节点
- java - 如何检查@RequestParam 是否为空
- android - Android:如何使用条件语句更改 TextColor
- java - 使用不同的实现版本(Android Studio)
- r - 如果,那么 R 中的语句