我有以下数据,如下所示 表
+----------+-----------+-------------+
| 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
请有人指出我在这里做错了什么。
答案 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>