我想知道如何通过编写外连接查询来获得所需的输出(如下所述) 其中外连接的表是其他连接条件在语句左外连接与相同的表作为外连接的一部分
给出的以下数据结构,其中 - 表A是含有一些任意对象 主表 - 表B由A引用其中A.TYPE_ID = B.ID - 表C之间defininfs关系表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中的所有对象是与它们与之相关联的对象的名称(否则为空),它们是类型2, 即外部连接以获得类型1的所有对象,而不管它们是否具有关联,但是如果它们这样做,那么我需要对象的名称。 请注意,类型1的对象将始终处于目标中。
对于上面例子中的输出是
-------------------------------
| 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的附加行吗? – Mikeb 2011-12-20 13:13:47
不,因为我想要所有的类型1,并且只有它们与类型2相关时才显示类型2信息。在这种情况下,名称1与类型2和类型3都关联,但我对此不感兴趣。 – omarello 2011-12-20 13:19:32