繁体   English   中英

多对多自我连接的SQL查询

[英]SQL query for many-to-many self-join

我有一个数据库表,旁边有一个伴随的多对多自联接表。 主表是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部分”的替代,而“第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平台。

您必须创建分层树,可能必须使用before by connect,nocycle查询类似这样的内容

select distinct p.part_id,p.part_number,p.description,c.main_part_id
from part p
left join (
            select main_part_id,connect_by_root(main_part_id) real_part_id
            from alternate_part
            connect by NOCYCLE prior main_part_id = alternate_part_id
        ) c 
on p.part_id = c.real_part_id and p.part_id != c.main_part_id
order by p.part_id

您可以在http://docs.oracle.com/cd/B28359_01/server.111/b28286/queries003.htm中阅读有关分层查询的完整文档。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM