我有一个数据库表,旁边有一对多对多的自联接表。主表是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平台。
答案 0 :(得分:0)
你必须创建分层树,可能你必须使用先前的nocycle查询连接 像这样的东西
>(\d*.\d*)<
您可以在http://docs.oracle.com/cd/B28359_01/server.111/b28286/queries003.htm
阅读有关分层查询的完整文档