2011-05-12 95 views
0

我的表连接和定位有以下栏目:如何多次连接同一个表?

连接:

LocationIDFrom 
LocationIDTo 
Duration 

地点:

LocationID 
LocationName 

的示例记录如下: 连接:

1, 2, 3ms 
2, 1, 5ms 
1, 5, 12ms 
3, 2, 2ms 

地点:

1, New York 
2, Boston 
3 Los Angeles 

我想显示的列LocationFrom,LocationTo,持续时间的表。上面记录的例子是

New York, Boston, 3ms 
Boston, New York, 5ms 
Los Angeles, Boston, 2ms 

我尝试使用下面的查询

SELECT l1.LocationName AS LocationFrom, l2.LocationName AS LocationTo, c.Duration 
FROM Connection c 
    INNER JOIN Location l1 ON l1.LocationID= c.LocationIDFrom 
    INNER JOIN Location l2 ON l2.LocationID= c.LocationIDTo 

但结果却是不完整的;有些行缺少位置详细信息存储在位置表中的LocationIDFrom和LocationIDTo。

有谁知道如何修改上面的查询或写入正确的返回表的位置名称必须从同一个表中检索LocationFrom和LocationTo而不是ID?

Here我找到了类似问题的解决方案,但不知道为什么该原理不适用于上述问题。

+1

我不明白如何可能有行丢失。你能详细说明一下吗?我假设你具有参照完整性,即连接中的每个位置ID真的存在于位置... – 2011-05-12 14:00:00

+1

您的查询对我来说是正确的。有没有哪个位置ID可能是NULL的情况?如果是这样,你会想使用'LEFT JOIN'而不是'INNER JOIN'。 – 2011-05-12 14:01:19

+0

我的错!如果所有ID的位置详细信息存储在位置表中,则查询返回正确的结果。我忽略了一个不正确的条目。 – 2011-05-12 14:34:21

回答

5

这是因为您不能加入ID 5,因为它不存在。如果您离开外部连接,您将选择连接,并且不会为不存在的位置命名。

SELECT isNull(l1.LocationName,'') AS LocationFrom, isNull(l2.LocationName,'') AS LocationTo, c.Duration 
FROM Connection c 
left outer JOIN Location l1 ON l1.LocationID= c.LocationIDFrom 
left outer JOIN Location l2 ON l2.LocationID= c.LocationIDTo 
相关问题