SQL 将两种方式合并为一个结果

SQL join both ways to one result

我有两个 table "TestItem" 和 "Connector",其中连接器用于关联 "TestItem" 中的两个项目。 我有两个问题,按优先顺序排列。但首先,请随意提出替代方法。我愿意接受建议,以完全重新考虑我在这里想要实现的目标的方法。

Question 1) How to get relations both ways returned in the same result

Question 2) How to filter the most efficient way for specific items

Q1) 两个 tables

Table: "TestItem"

ID, ITEM 
 1, "John Doe" 
 2, "Peggy Sue" 
 3, "Papa Sue"

Table: "Connector"

MOTHER, CHILD
     1,2

连接器 table 将用于多种用途(见下文),但这是平等类型连接的精炼场景,例如婚姻。如果 "John Doe" 与 "Peggy Sue" 结婚,则该信息也应该足以 return "Peggy Sue" 与 "John Doe" 结婚。 我可以在两个查询中执行此操作,但为了提高效率(尤其是关于我的问题 2),我希望在一个查询中完成此操作,因此实现不依赖于定义连接的方式。 最有效的方法是什么?

两个查询方法来说明如何获取数据,但是一个连接是如何以一种或另一种方式丢失的。

 //Connector through "mother"-part SELECT ITEM, SUBITEM FROM TestItem
 INNER JOIN (
     SELECT MOTHER, ITEM AS SUBITEM
     FROM Connector
     INNER JOIN TestItem ON Connector.CHILD = TestItem.ID
     ) AS SUB   ON TestItem.ID = SUB.MOTHER

  /* WHERE ITEM = "John Doe"  return "Peggy Sue" => Correct
     WHERE ITEM = "Peggy Sue" return  nothing => Wrong
  */

 //Connector through "child"-part SELECT ITEM, SUBITEM FROM TestItem
 INNER JOIN (
     SELECT CHILD, ITEM AS SUBITEM
     FROM Connector
     INNER JOIN TestItem ON Connector.MOTHER= TestItem.ID
     ) AS SUB   ON TestItem.ID = SUB.CHILD


  /* WHERE ITEM = "John Doe"  return nothing => Wrong
     WHERE ITEM = "Peggy Sue" return "John Doe" => Correct
  */

Q2) 将两种方法 return 合并到一个结果中可能会增加所涉及的数据量,从而降低性能。如果我的重点是 Peggy Sue,我认为尽早仅整理出相关数据会提高性能。是否有从顶层执行此操作的巧妙方法,或者每个子查询都需要添加 WHERE 吗?


PS: 一些更大视角的更多信息。 我计划将连接器 table 用于多种用途,既包括上述相同类型,如同事、家人、朋友等,也用于分层连接类型,如 mother/child、leader/employee, country/city. 因此,消除 mother/child 类型连接的解决方案可能不适合我更大的目的。 基本上我要求如何处理相同类型的连接,而不会失去使用相同架构和数据进行分层连接的机会。 Peggy Sue 可以通过相同的数据集通过关系

定义为 Papa Sue 的女儿
Mother, Child, Mother_type, Child_type
3, 2, Father, Daughter
1, 2, Married to, Married to

(但正如我在这里要求的那样。)

UNION ALL 可能是您要找的:

select mother.id as connectedToId,
       mother.item as connectedToItem, 
       'Mother' as role
from TestItem ti
     join Connector c on c.child = ti.id
     join TestItem mother on c.mother = mother.id
where ti.item = 'John Doe'
union all
select child.id as connectedToId,
       child.item as connectedToItem, 
       'Child' as role
from TestItem ti
     join Connector c on c.mother = ti.id
     join TestItem child on c.child = child.id
where ti.item = 'John Doe'