首页 > 解决方案 > 我需要帮助识别在另一个表中具有不同状态的表成员组

问题描述

我无法通过谷歌搜索来解决这个问题。我对 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 |
+---------------+-----------------+----------------+

标签: tsql

解决方案


一种选择使用聚合:

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);

在此处输入图像描述

演示


推荐阅读