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'
我有两个 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'