从SQL中的子记录中导出父记录

时间:2018-05-23 22:46:27

标签: sql sql-server database left-join

我有以下数据,如下所示 表

+----------+-----------+-------------+
| Child_ID | Parent_ID | Identifier  |
+----------+-----------+-------------+
| C1       | p1        | IN          |
| C2       | p1        | OUT         |
| C1       | p2        | IN          |
| C2       | p2        | OUT         |
| C1       | p3        | IN          |
| C2       | p3        | OUT         |
+----------+-----------+-------------+

我需要以这样一种方式输出数据:我可以在一个单独的行中显示父记录,该行根据标识符链接2子ID。

期望的结果:

+----+-----------+---------+----------+------------+
| ID | Parent_ID | Child_1 | Child_2  | Identifier |
+----+-----------+---------+----------+------------+
| C1 | P1        | NULL    | NULL     | IN         |
| C2 | P1        | NULL    | NULL     | OUT        |
| P1 | NULL      | C1      | C2       | IN         |
| C1 | P2        | NULL    | NULL     | IN         |
| C2 | P2        | NULL    | NULL     | OUT        |
| P2 | NULL      | C1      | C2       | IN         |
+----+-----------+---------+----------+------------+

要实现这个,我运行了以下查询,我尝试将join连接到单独的父记录,然后UNION查找子记录。

-- Parent 
Select c1.PARENT_ID as ID,
       Parent_Id,
       c1.Child_ID as Child_1
       c2.Child_ID as Child_2
       c1.Identifier
from sampletable as c1
left join sampletable as c2
on c2.PARENT_ID = c1.PARENT_ID 
and c2.Identifier = 'OUT'
where c1.Identifier = 'IN'

UNION

-- CHILD
Select child_id as ID,
       Parent_id,
       CASE when Identifier = 'IN' then Child_ID
       Else NULL END As Child_1,
       CASE when Identifier = 'OUT' then Child_ID
       Else NULL END As Child_2,
       Identifier
from sampletable 
where parent_id is not null

请有人指出我在这里做错了什么。

1 个答案:

答案 0 :(得分:0)

按原样选择孩子。

父母在FROM中使用子查询来获取不同Parent_ID的集合。如果只有两个孩子,您可以使用其他子查询分别在列列表中选择min(Child_ID)max(Child_ID)

UNION ALL两个结果。

UNION ALL的结果进行外部查询,并按coalesce(Parent_ID, ID), CASE WHEN ID IS NULL THEN 1 ELSE 0 END, ID对其进行排序,以达到您想要的顺序。 CASE是确保ID NULL成为最后的NULLS的黑客。 (我不确定SELECT * FROM (SELECT Child_ID ID, Parent_ID, NULL Child_1, NULL Child_2, Identifier FROM sampletable UNION ALL SELECT x.Parent_ID ID, NULL Parent_ID, (SELECT min(Child_ID) FROM sampletable y WHERE y.Parent_ID = y.Parent_ID) Child_1, (SELECT max(Child_ID) FROM sampletable y WHERE y.Parent_ID = y.Parent_ID) Child_2, 'IN' Identifier FROM (SELECT DISTINCT Parent_ID FROM sampletable) x) u ORDER BY coalesce(Parent_ID, ID), CASE WHEN ID IS NULL THEN 1 ELSE 0 END, ID; 在SQL Server中是第一个还是最后一个,而且现在懒得查找它。或者,如果我没记错的话,还有一个数据库范围的选项?无论如何,明确地将它显示在查询是最安全的赌注。)

var twitterUsuario = 'User';

function tweetCurrentPage() {
    window.open('https://twitter.com/share?url='+escape(window.location.href)+'&text='+ document.getElementById('suNombre').innerHTML + ' tengo un mensaje muy importante para ti ' + 'desde @' + twitterUsuario, '', 'menubar=no,toolbar=no,resizable=yes,scrollbars=yes,height=300,width=600');    return false; 
}

<a href="javascript:tweetCurrentPage()" target="_blank" alt="Tweet this"><span>Tweet</span></a>

SQL Fiddle