繁体   English   中英

如何多次自行加入此表?

[英]How do I self join this table multiple times?

我有一个列出以下列的表格:

员工 ssn、受抚养人 ssn、姓氏、名字、关系、福利金额

在关系列中,它将显示员工、孩子或配偶。

我需要的是以下内容:

员工 ssn、姓氏、名字、ee 福利、儿童福利、配偶福利。

我需要加入员工 ssn 匹配的福利金额列,但问题是每当我这样做时,它会给我同一员工的倍数,有时孩子和/或配偶福利不正确。

这是我写的:

SELECT a.[employee ssn], a.[last name], a.[first name], a.[benefit amount], b.[benefit amount] AS "child benefit", c.[benefit amount] AS "spouse benefit"
FROM allenrollments a
JOIN allenrollments b ON b.[employee ssn] = a.[employee ssn]
JOIN allenrollments c ON c.[employee ssn] = a.[employee ssn]
WHERE a.relationship = "Employee" AND b.relationship = "Child" AND c.relationship = "Spouse"

您遇到了交叉连接或笛卡尔积的常见问题。 对于连接到第二个表的第一个表中的每条记录也与第三个表结合(在这种情况下基于普通员工 SSN。

请注意,许多系统出于多种原因试图取消 SSN 作为主键,并且通常具有自动递增编号,并且仅使用 SSN 作为查找详细信息的基础。 否则,您的系统中的 SSN 就会泛滥,如果被黑客入侵则暴露是不好的(尽管被坏/恶意的演员入侵绝不是一件好事)。

现在,这就是你所拥有的。 您正在尝试获取配偶和孩子的数据。 但是,如果家庭保险福利计划有 5 个孩子怎么办。 你的最终目标是什么? 您可能会做得更好的是获取所有行并且只有一个列指示它与谁相关联。 然后,一旦获得整个家庭计划的数据,您就可以进行任何计数/总和覆盖检查。

此外,在列名中有空格也不是一件好事。 您将始终追逐不平衡的[括号]来应对,输出结果查询到类结构,例如获取事物列表等。说了这么多,我建议您尝试

SELECT 
      emp.[employee ssn] SSN, 
      emp.[last name] EmpLastName, 
      emp.[first name] EmpFirstName, 
      emp.[benefit amount] EmpBenefitAmount,     
      fam.[last name] FamilyMemberLastName, 
      fam.[first name] FamilyMemberFirstName, 
      fam.relationship FamilyRelationship,
      case when fam.relationship = 'Spouse'
           then fam.[benefit_amount]
           else 0 end SpouseBenefit,
      case when fam.relationship = 'Spouse'
           then 0
           else fam.[benefit_amount] end ChildBenefit
   FROM 
      allenrollments emp
         JOIN allenrollments fam
            on emp.[employee ssn] = fam.[employee ssn]
           AND NOT emp.relationship = 'Employee'
   where
      emp.relationship = 'Employee'

所以第一个表完全基于被覆盖的员工。 然后通过 SSN 加入同一张表以查找所有其他家庭成员。 我认为您甚至不需要达到 SpouseBenefit 与 ChildBenefit 列的级别。 它可能只是福利金额 AS FamilyMemberBenefitAmount。

我假设存在一些潜在的数据问题,这就是我们自我加入的原因,在这种情况下:

WITH dependants as (
SELECT 
 [employee ssn],
 [benefit amount],
 RANK() 
  OVER (
   PARTITION BY [employee ssn] 
   ORDER BY [benefit amount] DESC
  ) as unique_key
FROM allenrollments
WHERE 
 [relationship] IN('Child', 'Spouse')
)

SELECT 
 emp.[employee ssn],
 emp.[first name],
 emp.[last name],
 emp.[benefit amount] as EmployeeBenefit,
 dep.[benefit amount] as DependantBenefit
FROM allenrollments emp
JOIN 
 dependants dep on emp.[employee ssn] = dep.[employee ssn]
WHERE 
 dep.unique_key = 1 AND 
 emp.relationship = 'Employee'

在这里,我们使用CTE创建一个列出所有相关福利及其相关员工 ssns 的查询。 我们正在使用RANK()函数为我们提供可以过滤的内容(因为如果有多个受抚养人,我们将获得每个员工 ssn 的多条记录)。 然后,我们过滤值“员工”和外部查询中的第一个排名。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM