【发布时间】:2022-12-07 02:23:51
【问题描述】:
我正在尝试创建一个 Select 命令来组合 3 个表。
GROUPS,我想查看该表的每条记录,该表满足该表的 WHERE CONTACTS,我想查看满足一定条件的联系人,如果没有联系人我还是想在查询中查看GROUP记录 GROUPCONTACTS,此表位于 GROUPS 和 CONTACTS 之间以允许多对多关系。
我尝试了以下方法,但它向我显示了每个 GROUPCONTACTS 记录,而不仅仅是那些存在与查询匹配的相关联系人的记录。我不知道 SQL 是否允许我想要的。
运行 MSSQL 服务器的 Azure 服务器。
SELECT G.GroupID, GC.ContactID, C.ContactID, C.Status, C.Type
FROM Groups G
LEFT JOIN GroupContacts GC
ON GC.GroupID = G.GroupID
JOIN Contacts C
ON C.ContactID = GC.ContactID
AND C.Type = 'Manager'
AND C.Status = 'Active'
WHERE G.Status = 'Active' AND G.Type = 'Physician'
我希望看到 1951 年的结果显示每个组有 1 条记录,无论是否有匹配的联系人。相反,我得到了 1550 个结果,排除了所有没有匹配联系人的组。
我希望我解释得足够好 我怎样才能让表 Contacts JOIN 与 GroupContacts 相继得到结果 LEFT JOIN 与 GROUPS?
示例源表 团体
| GroupID | Type | Name | Status |
|---|---|---|---|
| 1 | Physician | Drs. Bennett & Stein | Active |
| 2 | Physician | Drs. Kogan & Larson | Inactive |
| 6 | Physician | Diagnostic Imaging | Active |
群组联系人
| GroupContactID | GroupID | ContactID |
|---|---|---|
| 13258 | 2227 | 124 |
| 13259 | 2305 | 138 |
| 13260 | 526 | 251 |
| 13261 | 2900 | 351 |
| 13262 | 1363 | 371 |
| 13263 | 2408 | 460 |
| 13264 | 417 | 511 |
联系人
| ContactID | Type | First Name | Last Name | Status |
|---|---|---|---|---|
| 375 | Physician | Mervyn L. | Elgart | Inactive |
| 376 | Physician | Stephen S. | Elgin | Inactive |
| 377 | Physician | Oscar | Ellison III | Active |
| 378 | Physician | Michael | Emmer | Active |
结果(理想)
| GroupID | ContactID | ContactID | Status | Type |
|---|---|---|---|---|
| 3177 | 36187 | 36187 | Active | Manager |
| 3178 | 36188 | 36188 | Active | Manager |
| 3179 | 36189 | 36189 | Active | Manager |
| 3180 | NULL | NULL | NULL | NULL |
如果 GROUPS 没有匹配的 GROUPCONTACT 记录,则将最后 4 个字段显示为 NULL。 2 个 ContactID 的原因仅用于测试目的。
【问题讨论】:
-
请添加几行示例数据和预期结果。只需简单的数据,以便我们了解您的需求。
-
如果没有看到模式和数据,就很难提供帮助......一个快速的尝试是通过对联系人进行 LEFT JOIN 而不是 JOIN,看看是否能给你想要的东西。您几乎可以肯定地做您想做的事情,但是如果不了解架构和查看一些数据,就很难提供有意义的帮助。
-
@PaulC:我在每个表之前和之后添加了空行以使其看起来不错......
标签: sql sql-server