如何解决检查CTE定位查询中的重复值以提高性能
我有两个桌子。 FIDDLE HERE
DETAILS
+-----+-----------+
| id | valid |
+-----+-----------+
| 101 | VALID |
| 102 | NOT VALID |
| 103 | VALID |
| 104 | NOT VALID |
+-----+-----------+
RELATION
+--------+-------+-------+
| parent | child | stock |
+--------+-------+-------+
| 101 | C1 | 3 |
| 102 | C1 | 1 |
| 103 | C2 | 4 |
| 104 | 102 | 3 |
| C1 | C101 | 6 |
| C101 | C201 | 2 |
| C2 | C101 | 3 |
| 103 | C3 | 5 |
| C2 | C3 | 4 |
+--------+-------+-------+
我必须从DETAILS
中获取所有ID,并从RELATION
表中找到其所有子级。所以预期的输出是。
+------+--------+
| ID | STATUS |
+------+--------+
| 101 | Valid |
| 102 | Valid |
| 103 | Valid |
| 104 | Valid |
| C1 | Valid |
| C101 | Valid |
| C2 | Valid |
| C201 | Valid |
| C3 | Valid |
+------+--------+
目前,我正在使用下面的CTE,它花费了很多时间,并且重复很多。
WITH CTE AS (
SELECT DISTINCT ID,'Valid' STATUS FROM DETAILS
UNION ALL
SELECT REL.CHILD,CTE.STATUS FROM RELATION REL
JOIN CTE ON REL.PARENT=CTE.ID
)
SELECT * FROM CTE
我也尝试像SELECT DISTINCT * FROM CTE
一样使用DISTINCT,但是性能没有任何改善。我的details
表包含382000行,而relation
表具有2600000行。另外,有多个父母有同一个孩子的可能性。因此,如果可能的话,我试图避免在CTE中重复孩子。如果没有,还有其他选择吗?任何建议将不胜感激。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。