多对多自联接的

时间:2015-08-01 18:47:39

标签: sql oracle

我有一个数据库表,旁边有一对多对多的自联接表。主表是part,另一个表是alternate_part(基本上,备用部分与它们的主要部分相同,具有不同的#)。 alternate_part表中的每条记录也在part表中。举例说明:

`part`

| part_id | part_number | description |
|---------|-------------|-------------|
|       1 |    00001    |    wheel    |
|       2 |    00002    |     tire    |
|       3 |    00003    |   window    |
|       4 |    00004    |     seat    |
|       5 |    00005    |    wheel    |
|       6 |    00006    |     tire    |
|       7 |    00007    |   window    |
|       8 |    00008    |     seat    |
|       9 |    00009    |    wheel    |
|      10 |    00010    |     tire    |
|      11 |    00011    |   window    |
|      12 |    00012    |     seat    |


`alternate_part`

| main_part_id | alt_part_id |
|--------------|-------------|
|            1 |           5 | // Wheel
|            5 |           1 | // |
|            5 |           9 | // |
|            9 |           5 | // |
|            2 |           6 | // Tire
|            6 |           2 | // |
|          ... |         ... | // |

我正在尝试生成一个简单的SQL查询,它将为我提供主要部分的所有替换项的列表。棘手的部分是:某些替代品仅被列为替代品的替代品,不能保证零件的每个可行替代品都被列为直接替代品。例如,如果'第3部分'是'第2部分'的替代,它是'第1部分'的替代,那么第3部分是第1部分的替代(即使alternate_part表没有列出直接链接)。反之亦然(第1部分是第3部分的替代)。

基本上,现在我正在拉替代并迭代它们

SELECT p.*, ap.*
FROM part p
INNER JOIN alternate_part ap ON p.part_id = ap.main_part_id

然后回去再对那些候补人员做同样的事情。但是,我认为必须有更好的方法。

我正在寻找的SQL查询基本上会给我:

| part_id | alt_part_id |
|---------|-------------|
|       1 |           5 |
|       1 |           9 |

对于part_id = 1,即使是1&在替代表中没有明确地链接9。

注意:我无法控制数据库的结构,它是一个分布式软件解决方案。 注2:如果它影响语法,则它是Oracle平台。

1 个答案:

答案 0 :(得分:0)

你必须创建分层树,可能你必须使用先前的nocycle查询连接 像这样的东西

>(\d*.\d*)<

您可以在http://docs.oracle.com/cd/B28359_01/server.111/b28286/queries003.htm

阅读有关分层查询的完整文档