gpt4 book ai didi

sql - Left Outer join 与同一个表作为外部连接的一部分

转载 作者:行者123 更新时间:2023-12-01 22:43:07 25 4
gpt4 key购买 nike

我想知道如何通过编写外连接查询来获取所需的输出(如下所述)我外部连接的表是语句中其他连接条件的一部分

给定以下数据结构,其中- 表 A 是包含一些任意对象的主表- 表 B 由 A 引用,其中 A.TYPE_ID = B.ID- 表 C 定义表 A 中对象之间的关系,其中 C.SOURCE_ID 引用 A.ID,C.TARGET_ID 引用 A.ID

这就是架构的定义方式,我对此无能为力(这是一个遗留系统)

TABLE_A                 
---------------------------
| ID | TYPE_ID | Name |
|-------------------------|
| 1 | 1 | Name 1 |
| 2 | 2 | Name 2 |
| 3 | 1 | Name 3 |
| 4 | 1 | Name 4 |
| 5 | 3 | Name 5 |
|-------------------------|

TABLE_B
----------------------
| ID | TYPE_NAME |
|--------------------|
| 1 | Type 1 |
| 2 | Type 2 |
| 3 | Type 3 |
| 4 | Type 4 |
|--------------------|

TABLE_C
-------------------------------
| PK | SOURCE_ID | TARGET_ID |
|-----------------------------|
| 11 | 2 | 1 |
| 12 | 2 | 3 |
| 13 | 5 | 1 |
| 13 | 5 | 4 |
-------------------------------

我想得到的是“类型 1”的表 A 中的所有对象以及它们关联的对象的名称(否则为 null),它们是类型 2,即外连接获取类型 1 的所有对象,无论它们是否有关联,但如果它们有关联,那么我需要对象的名称。请注意,类型 1 的对象将始终位于关系中的 TARGET 中。

上面例子的输出是

-------------------------------
| Target Name | Source Name |
|-----------------------------|
| Name 1 | Name 2 |
| Name 3 | Name 2 |
| Name 4 | (NULL) |
|-----------------------------|

我原来的连接查询(无法使外部连接工作)这是正常连接,不显示没有关联的对象。

select atrgt.NAME, asrc.NAME
from TABLE_A atrgt
JOIN TABLE_B trgttype on atrgt.TYPE_ID = trgttype.ID
and trgttype.TYPE_NAME = 'Type 1'
JOIN TABLE_C assoc on atrgt.ID = assoc.TARGET_ID
JOIN TABLE_A asrc on asrc.ID = assoc.SOURCE_ID
JOIN TABLE_B srctype on asrc.TYPE_ID = srctype.ID
and srctype.TYPE_NAME = 'Type 2'

最佳答案

基本上在这些情况下,我认为最好的方法是将查询分割为两个普通连接,然后在这些结果集之间进行外部连接。如果您将 SQL 视为过程代码,您可能会认为它看起来效率低下,但查询优化器不一定会独立运行两个子连接。

您没有说明您使用的是什么 RDBMS。在 Oracle 中我可能会这样写:

with
src_type_2 as (
select c.target_id, a.name
from table_c c
join table_a on a.id = c.source_id
join table_b on b.id = a.type_id
where b.type_name = 'Type 2'
),
all_type_1 as (
select a.id, a.name
from table_a a
join table_b on b.id = a.type_id
where b.type_name = 'Type 1'
)
select tgt.name, src.name
from all_type_1 tgt
left join src_type_2 src on src.target_id = tgt.id

关于sql - Left Outer join 与同一个表作为外部连接的一部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8575746/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com