【发布时间】:2012-01-24 10:25:12
【问题描述】:
我想知道如何通过编写外连接查询来获得所需的输出(如下所述) 我外部连接的表是语句中其他连接条件的一部分
给定以下数据结构,其中 - 表 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'
【问题讨论】:
-
您的“正确”输出表是否应该包含名称 1、Null 的附加行?
-
不,因为我想要所有类型 1,并且只有当它们与类型 2 相关联时才显示类型 2 信息。在这种情况下,名称 1 与类型 2 和类型 3 相关联,但我对此不感兴趣。
标签: sql left-join outer-join