SQL加入5个表 - 包含&排除

时间:2017-11-26 17:57:28

标签: sql sql-server join union

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

我的表是:

  1. 客户 - 包含电子邮件地址(唯一ID),电子邮件地址域名,帐户名称,人口统计信息等(客户)
  2. 产品1客户帐户名称(Product1Accounts)
  3. 产品1客户电子邮件地址域名(Product1Domains)
  4. 产品2客户帐户名称(Product2Accounts)
  5. 产品2客户电子邮件地址域名(Product2Domains)
  6. 我需要的3个结果是:

    1. 不包括产品2客户的产品1客户
    2. 不包括产品1客户的产品2客户
    3. 产品1和2的客户
    4. 附注:每个产品的客户都可以通过帐户或域名识别。

      我可以创建以下内容来提供表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
      

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

2 个答案:

答案 0 :(得分:0)

对于第三个结果,您可以继续添加UNION以获取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
)

答案 1 :(得分:0)

我认为您的数据库结构不正确,您有2个产品的2个不同的表。这是否意味着如果将来你还有5个产品,你还会再增加5个产品?

我认为最好删除 product1 product2 表并创建一个产品表,然后您可以使用另一个名为productType的表,其中包含有关产品类型和外键连接到主要产品表

您的客户表中是否还有任何产品表都有外键?从我所看到的,他们试图加入的列的名称并不是很明确的外键。