【问题标题】:SQL Joining on 5 Tables - Inclusion & Exclusion5 个表上的 SQL 连接 - 包含和排除
【发布时间】:2017-11-26 17:57:27
【问题描述】:

我想加入 5 个表以得出 3 个不同的结果集。

我的桌子是:

  1. 客户 - 包含电子邮件地址(唯一 ID)、电子邮件地址域名、帐户名称、人口统计信息等(客户)
  2. 产品 1 客户帐户名称 (Product1Accounts)
  3. 产品1客户邮箱地址域名(Product1Domains)
  4. 产品 2 客户帐户名称 (Product2Accounts)
  5. 产品 2 客户电子邮件地址域名 (Product2Domains)

我需要的 3 个结果是:

  1. 产品 1 客户不包括产品 2 客户
  2. 产品 2 客户不包括产品 1 客户
  3. 产品 1 和 2 的客户

旁注:每个产品的客户都可以通过帐户或域名来识别。

我可以创建以下内容以在表 1、2、3 或 1、4、5 上找到匹配项,但我对如何合并排除项感到困惑

SELECT *
FROM Customers
INNER JOIN Product1Accounts 
ON Customers.Company=Product1Accounts.Account
UNION
SELECT *
FROM Customers
INNER JOIN Product1Domains 
on Customers.Email_Address_Domain=Product1Domains.Domain

我也不确定如何获得我正在寻找的第三个结果集...任何关于如何更好地编写此代码的帮助或建议将不胜感激。

【问题讨论】:

  • 你在用什么rdbms
  • SQL Server Express 2017 / SQL Server Management Studio

标签: sql sql-server join union


【解决方案1】:

对于第三个结果,您可以继续添加UNIONs 以获得Product2 表的额外结果(这真的闻起来像数据库需要标准化)。

对于前两个结果,EXCEPT 关键字应该可以工作。我不使用 SQL Express,所以我不确定它在那个版本的 SQL Server 中是否可用,但请检查一下。您的代码如下所示:

(
SELECT C.Company
FROM Customers C
INNER JOIN Product1Accounts PA ON PA.Account = C.Company
UNION
SELECT C.Company
FROM Customers C
INNER JOIN Product1Domains PD ON PD.Domain = C.Email_Address_Domain
)
EXCEPT
(
SELECT C.Company
FROM Customers C
INNER JOIN Product2Accounts PA ON PA.Account = C.Company
UNION
SELECT C.Company
FROM Customers C
INNER JOIN Product2Domains PD ON PD.Domain = C.Email_Address_Domain
)

【讨论】:

    【解决方案2】:

    我认为您的数据库结构不正确,您对 2 个产品有 2 个不同的表。是不是意味着如果你以后有 5 个产品,你就会有 5 个表?

    我认为最好删除 product1product2 表并创建一个产品表,然后您可以拥有另一个可以称为 productType 的表,其中包含以下信息产品的类型,并通过外键连接到您的主 产品表

    您的任何产品表是否在您的客户表中也有可用的外键?从我所见,您尝试加入的列的名称并不清楚是否是外键。

    【讨论】:

    • 是的,我同意 - 目前这是一个非常混乱的结构。不幸的是,我现在只需要匹配公司和域名。
    猜你喜欢
    • 2012-03-10
    • 1970-01-01
    • 1970-01-01
    • 2022-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多