我有mytable
,如下所示:
id child
1
2 1
3 1
4
5
6 5
7
8
等。 我想选择所有的孩子和所有的父母。
这个例子应该是:
id child
1
2 1
3 1
5
6 5
我创建了这样的选择:
SELECT * FROM mytable where(
child
<>'')或id
IN(SELECT distinct {child
)FROM mytablechild
<> '');
但也许它可以以更优雅的方式完成,特别是考虑到速度。
答案 0 :(得分:0)
SELECT mytable.*
FROM mytable
JOIN mytable AS t2
WHERE mytable.id = t2.child
AND t2.child <> ''
UNION
SELECT *
FROM mytable
WHERE child <> ''
GROUP BY id, child
如果你有一个关于id的索引和另一个关于child的索引,那么这将使用双方的索引。 GROUP BY会对性能产生影响,但是必须防止来自UNION第一部分的重复记录。
答案 1 :(得分:0)
我要做的是首先得到这样的孩子名单:
SELECT DISTINCT child
FROM myTable
WHERE child IS NOT NULL;
这将为您提供1和5.然后您需要做的就是选择id在上面的子查询中的行,或者孩子在上面的子查询中的位置:
SELECT *
FROM myTable
WHERE id IN(
SELECT DISTINCT child
FROM myTable
WHERE child IS NOT NULL)
OR child IN(
SELECT DISTINCT child
FROM myTable
WHERE child IS NOT NULL)
AND child IS NOT NULL
ORDER BY id;
以下是SQL Fiddle示例。