SQL连接在多个级别上

时间:2014-04-04 09:09:08

标签: sql sql-server sql-server-2008

我正在为父客户端记录与SQL连接进行斗争并且刚刚发布了一个查询,但是在发布之后我意识到我的示例有点错误(但仍然是一个有用的帖子)所以我创建了一个新的,更准确的:)

如果我有以下数据库结构:

Table Regions
|Region_no | Region_Level  | owning_region_no |
| 1        |     1         |                  |
| 2        |     2         |          1       |
| 3        |     2         |          1       |
| 4        |     3         |          2       |
| 5        |     3         |          2       |
| 6        |     3         |          3       |

Table Postcodes
| Postcode | Region_no |
| PO32 3AE |     4     |
| PO32 3AA |     5     |
| PO32 3AF |     6     |

Table UnitsMappings
| Unit_No | region_no |
| 1       |     1     |
| 1       |     2     |
| 2       |     2     |
| 2       |     1     |
| 3       |     3     |
| 3       |     3     |
| 4       |     6     |
| 4       |     5     |

Table Units
| Unit_no | Unit_Name  |
|   1     |  South     |
|   2     |  SouthEast |
|   3     |  Central |
|   4     |  SouthWest |

[更新样本答案] 我真正想要的是以下内容:

| Unit_name | Postcode |
| South     | PO32 3AE |
| South     | PO32 3AA |
| South     | PO32 3AF |
| SouthEast | PO32 3AE |
| SouthEast | PO32 3AA |
| SouthEast | PO32 3AF |

即使南方只有区域1和2映射到它,级别3也会映射到级别2和1然后(并且邮政编码将映射到级别3& #39; S)

现在困难在于,我只想要与区域中的3级区域级别相关联的邮政编码(来自邮政编码表)。因此可能存在与unit_no关联的区域级别1,但是我需要底部的所有映射到级别3的邮政编码。

3 个答案:

答案 0 :(得分:0)

根据您的详细信息,这是我的映射,

unit => units_mapping

units_mapping => (邮政编码或地区)//假设使用所有表我们使用邮政编码

邮政编码=>区域

地区(主要)

select reg.region_no, Units.name , pc.postcodes
from regions reg,
     Postcodes pc,
     UnitsMappings UM,
     Units units
where reg.region_no = pc.region_no and 
      pc.region_no = UM.region_no and
      UM.Unit_No = Units.Unit_no
order by reg.region_no asc

如果一个表中有空,则不会出现记录...
处理使用内连接

尚未测试.....只是假设:)

答案 1 :(得分:0)

区域级别3中的区域的测试数据中没有有效的单位名称。

区域级别为3的区域为4,5和6。 没有与区域4相关联的单元,与区域5和6相关联的单元是单元4,但在表unit_name中没有单元4。

如果您有数据,那么此查询将获取数据

SELECT pc.postcode, u.unit_name
FROM regions reg
     INNER JOIN Postcodes pc ON reg.region_no = pc.region_no
     INNER JOIN UnitsMappings um ON reg.region_no = um.region_no
     INNER JOIN Units u ON um.unit_no = u.unit_no
WHERE reg.region_level = 3

将单位的连接从INNER更改为LEFT将获得带有NULL作为unit_name的测试数据的邮政编码。

答案 2 :(得分:-1)

试试这个,

Select u.Unit_name,pc.Postcode from Units as u
inner join UnitsMappings um on u.Unit_no = um.Unit_no
inner join Postcodes as pc on pc.Region_no = um.region_no