【问题标题】:SQL Group by Child Table with conditionsSQL Group by Child Table with conditions
【发布时间】:2013-04-18 00:20:02
【问题描述】:

我已经简化了一点来问这个问题。因此,请随心所欲地使用表格。

我有两张桌子

父表列是

ParentId,Parent_FirstName,Parent_LastName

子表列是

ChildId,Child_FirstName,Child_LastName,ParentId,Parent_FirstName,Parent_LastName

父表有一条记录

1,Joe,Bloggs

子表有3条记录

1,Bob,Lawrence,1,,

2,Sam,Hunt,NULL,Joe,Bloggs

3,Sam,Hunt,1,,

我希望能够通过使用查询获得以下信息

Joe Bloggs Bob Lawrence
Joe Bloggs Sam Hunt

但是..我希望能够通过以下链接父子表

1)If there is a parentid on the child table then link using the parentid
2)Else compare the parent_first and parent_lastname in the child table with that of the child tables

提前致谢

【问题讨论】:

    标签: sql group-by having


    【解决方案1】:

    像这样:

    SELECT
      p.Parent_FirstName,
      p.Parent_LastName,
      c.Child_FirstName,
      c.Child_LastName
    FROM parent AS p
    INNER JOIN child AS c ON p.ParentId = c.ParentId;
    

    在这里查看它的实际效果:

    这会给你:

    | PARENT_FIRSTNAME | PARENT_LASTNAME | CHILD_FIRSTNAME | CHILD_LASTNAME |
    -------------------------------------------------------------------------
    |              Joe |          Bloggs |             Bob |       Lawrence |
    |              Joe |          Bloggs |             Sam |           Hunt |
    

    注意:这个查询将JOIN这两个表使用一个简单的JOIN使用第一个条件来链接两个表:

    1) 如果子表上有 parentid,则使用 父母身份

    这就够了;它会给你你正在寻找的东西,但是对于你想要将子表与父表链接的第二个条件:

    2)Else 比较子表中的 parent_first 和 parent_lastname 与子表的关系

    您可以使用OR添加以下条件:

     c.ParentId IS NULL 
     AND c.Parent_FirstName = p.Parent_FirstName
     AND c.Parent_LastName  = p.Parent_LastName
    

    类似这样的:

    SELECT 
      p.Parent_FirstName,
      p.Parent_LastName,
      c.Child_FirstName,
      c.Child_LastName
    FROM parent AS p
    INNER JOIN child AS c ON p.ParentId = c.ParentId 
                          OR (c.ParentId IS NULL 
                              AND c.Parent_FirstName = p.Parent_FirstName
                              AND c.Parent_LastName  = p.Parent_LastName)
    

    这将为您提供相同的结果,但有重复的行:

    像这样:

    | PARENT_FIRSTNAME | PARENT_LASTNAME | CHILD_FIRSTNAME | CHILD_LASTNAME |
    -------------------------------------------------------------------------
    |              Joe |          Bloggs |             Bob |       Lawrence |
    |              Joe |          Bloggs |             Sam |           Hunt |
    |              Joe |          Bloggs |             Sam |           Hunt |
    

    DISTINCT 添加到SELECT 以消除重复行。


    免责声明:

    这假设您不是在寻找递归查询。

    【讨论】:

      猜你喜欢
      • 2017-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-31
      • 1970-01-01
      • 2013-12-20
      • 2020-11-05
      • 2020-10-26
      相关资源
      最近更新 更多