SQL Group by Child Table with conditions

时间:2013-04-18 00:20:02

标签: sql group-by having

我已经简化了一下这个问题。因此,请随意使用表格。

我有两张桌子

父表列是

ParentId,Parent_FirstName,Parent_LastName

子表列

ChildId,Child_FirstName,Child_LastName,ParentId,Parent_FirstName,Parent_LastName

父表有一条记录

1,Joe,Bloggs

子表有三条记录

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

提前致谢

1 个答案:

答案 0 :(得分:0)

像这样:

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,则使用   parentId的

这就足够了;它将为您提供所需的内容, ,以表示您要将子表与父表连接起来的第二个条件:

  

2)否则比较子表中的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以消除重复的行。


<强>声明:

这假设您没有寻找递归查询。