【问题标题】:Self JOIN to find the parent detail which matches with the row data -自联接以查找与行数据匹配的父详细信息 -
【发布时间】:2021-09-18 16:43:32
【问题描述】:

我正在尝试在 MS SQL 中进行查询,但无法解决。我有一张员工表:

Id  Name     Surname  FatherName  MotherName  WifeName  Pincode  isChild
--  -------  -------  ----------  ----------  --------  -------  -------
1   John     Green    James       Sue         null      101011   1
2   Michael  Sloan    Barry       Lilly       null      101011   1
3   Sally    Green    Andrew      Molly       Jemi      101011   1
4   Barry    Sloan    Soul        Paul        Lilly     101011   0
5   James    Green    Ned         White       Sue       101011   0

我想要一个查询来选择孩子的父亲姓名和母亲姓名与姓名和妻子姓名匹配的行。对于示例表,我想返回父亲和母亲姓名与姓名和妻子姓名列匹配的行的结果。例如。 id=1,其中 John 的父亲姓名 James 和母亲姓名 Sue 与 id 5 匹配,返回 James 作为名字,Sue 作为妻子姓名。所以我的查询应该返回(这是我的预期结果

Id  Name     Surname  FatherName  MotherName  WifeName  Pincode  isChild
--  -------  -------  ----------  ----------  --------  -------  -------
5   James    Green    Ned         White       Sue       101011   0
4   Barry    Sloan    Soul        Paul        Lilly     101011   0

我尝试使用以下查询,但它只检查 James。如何更改我的查询以检查所有名称并返回预期结果。

select * FROM employees
where first_name like '%James%'
and wife_name like '%Sue%'
and pincode=101011;

这方面的任何提示都会非常有帮助。我是新加入,需要帮助编写自我加入以获得结果。

【问题讨论】:

  • 请分享上述示例的创建表和插入数据脚本。

标签: sql sql-server tsql sql-server-2008 join


【解决方案1】:

试试这个:

SELECT
        T2.*
FROM    Employee T1
JOIN    Employee T2 ON  T2.Name     =   T1.FatherName
                    AND T2.WifeName =   T1.MotherName

【讨论】:

    【解决方案2】:

    评论太长了,但也不是要抨击你正在使用的东西。请作为建设性的批评。

    除了表格内容的设计非常糟糕之外,在您深入了解您正在做的任何事情之前,首先应该先纠正它。一个更典型的设计可能是有一张人桌。现在,要获得关系,您可以采取几种方式。一是在每个人的记录上,您添加 2 个额外的 ID。父亲ID,母亲ID。这些 ID 将直接连接回孩子与要匹配的硬字符串。取一个像史密斯或琼斯这样的姓氏。然后,看看“约翰史密斯”可能存在的许多实例,是的很多,并且找到匹配妻子的名字 Sue、Mary 或其他任何名字的可能性较低。但即使这样也可能导致多种可能性。是的,您正在添加 PIN,但即使是计算机也可以生成 1234 的随机 PIN。

    有了 ID,与谁的关系就不会模棱两可了。

    如果数据被稍微改变成类似的东西

    Id  Name     Surname        FatherID    MotherID    SpouseID  
    --  -------  -------        ----------  ----------  --------  
    1   John     Green          5           6           null      
    2   Michael  Sloan          4           3           null      
    3   Lilly    Sloan          null        null        4
    4   Barry    Sloan          null        null        3
    5   James    Green          9           10          6         
    6   Sue      Green          7           8           5         
    7   Bill     Jones          null        null        8       
    8   Martha   Jones          null        null        7
    9   Brian    Green          null        null        10
    10  Beth     Smith-Green    null        null        9
    

    因此,在这个修改后的示例中,您可以立即看到 ID#1 John Green 的父亲 (ID#5) 是 James,母亲 (ID#6) 是 Sue。但即便如此,詹姆斯还是​​父亲 (ID#9) 布莱恩和母亲 (ID#10) 贝丝的孩子。这种情况向祖父母级别的能力显示,詹姆斯和苏每个人也是孩子,但对他们各自的父母来说。苏的琼斯姓氏的父母。

    献给 #4 Barry 和 #3 Lilly 的父母 Michael Sloan。

    我还添加了配偶 ID。这可以防止重复复制的人名的冗余。然后你可以根据孩子的父母各自的ID进行查询,找出一个有希望的名字LIKEguess。

    因此,即使不解决相对简单的查询,修复数据库的底层基础和关系将长期帮助您在未来简化查询。

    【讨论】:

      【解决方案3】:

      select *
      from thetable as p -- the parent/father
      where exists -- with one child at least
      (
          select * 
          from thetable as c 
          where c.fathername = p.name 
          and c.mothername = p.wifename
          -- lastname?
      )
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-09-03
        • 1970-01-01
        • 2021-06-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-02
        相关资源
        最近更新 更多