【问题标题】:Query Select with multiple tables and needing Left Join查询选择多个表并需要左连接
【发布时间】: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


【解决方案1】:

下次,请发布CREATE TABLEINSERT INTO 设置声明。我创建所有这些语句只是为了意识到GroupContacts 表中的数据与GroupsContacts 中的任何示例数据都不匹配。修复数据。包括一个被排除在外但您认为应该包括的数据示例。然后我会更新我的答案。

CREATE TABLE Groups (
  GroupID int not null
  , Type nvarchar(50) not null
  , Name nvarchar(50) not null
  , Status nvarchar(50) not null
);

INSERT INTO Groups (GroupID, Type, Name, Status)
VALUES
   (1, 'Physician', 'Drs. Bennett & Stein', 'Active')
  , (2, 'Physician', 'Drs. Kogan & Larson','Inactive')
  , (6, 'Physician', 'Diagnostic Imaging', 'Active')
;

CREATE TABLE GroupContacts (
  GroupContactID int not null
  , GroupID int not null
  , ContactID int not null
);

INSERT INTO GroupContacts (GroupContactID, GroupID, ContactID)
VALUES 
  (13258,2227,124)
  , (13259,2305,138)
  , (13260,526,251)
  , (13261,2900,351)
  , (13262,1363,371)
  , (13263,2408,460)
  , (13264,417,511)
;

CREATE TABLE Contacts (
  ContactID int not null
  , Type nvarchar(50) not null
  , FirstName nvarchar(50) not null
  , LastName nvarchar(50) not null
  , Status nvarchar(50) not null
);

INSERT INTO Contacts (ContactID, Type, FirstName, LastName, Status)
VALUES 
  (375,'Physician','Mervyn L.','Elgart','Inactive')
  , (376,'Physician','Stephen S.','Elgin','Inactive')
  , (377,'Physician','Oscar','Ellison III','Active')
  , (378,'Physician','Michael','Emmer','Active')
;

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'
GroupID ContactID ContactID Status Type

fiddle

【讨论】:

  • 我意识到我需要做的是创建一个视图,然后将该视图左联接到表的查询中。我之前没有使用过 Views,但我在 MS Access 方面的有限经验让我认为这是解决方案。但是,我仍然会尝试将 Tim Jarosz 要求的内容放在一起,因为我很感兴趣是否可以在没有 VIEW 的情况下做到这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-16
  • 2023-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多