这有点复杂,但我有2张桌子.假设结构是这样的:
*Table1*
ID
PhoneNumber1
PhoneNumber2
*Table2*
PhoneNumber
SomeOtherField
Run Code Online (Sandbox Code Playgroud)
可以基于Table1.PhoneNumber1 - > Table2.PhoneNumber或Table1.PhoneNumber2 - > Table2.PhoneNumber来连接表.
现在,我想得到一个结果集,其中包含PhoneNumber1,SomeOtherField,它对应于PhoneNumber1,PhoneNumber2和SomeOtherField,对应于PhoneNumber2.
我想到了两种方法 - 通过两次加入表,或者在ON子句中加入OR一次.
方法1:
SELECT t1.PhoneNumber1, t1.PhoneNumber2,
t2.SomeOtherFieldForPhone1, t3.someOtherFieldForPhone2
FROM Table1 t1
INNER JOIN Table2 t2
ON t2.PhoneNumber = t1.PhoneNumber1
INNER JOIN Table2 t3
ON t3.PhoneNumber = t1.PhoneNumber2
Run Code Online (Sandbox Code Playgroud)
这似乎有效.
方法2:
以某种方式有一个看起来有点像这样的查询 -
SELECT ...
FROM Table1
INNER JOIN Table2
ON Table1.PhoneNumber1 = Table2.PhoneNumber OR
Table1.PhoneNumber2 = Table2.PhoneNumber
Run Code Online (Sandbox Code Playgroud)
我还没有得到这个工作,我不确定是否有办法做到这一点.
实现这一目标的最佳方法是什么?这两种方式都不简单或直观......有没有更简单的方法来做到这一点?这个要求一般如何实施?
我有表连接和位置与以下列:
连接:
LocationIDFrom
LocationIDTo
Duration
Run Code Online (Sandbox Code Playgroud)
地点:
LocationID
LocationName
Run Code Online (Sandbox Code Playgroud)
示例记录如下:连接:
1, 2, 3ms
2, 1, 5ms
1, 5, 12ms
3, 2, 2ms
Run Code Online (Sandbox Code Playgroud)
地点:
1, New York
2, Boston
3 Los Angeles
Run Code Online (Sandbox Code Playgroud)
我想显示包含LocationFrom,LocationTo,Duration列的表格.上面记录的例子是
New York, Boston, 3ms
Boston, New York, 5ms
Los Angeles, Boston, 2ms
Run Code Online (Sandbox Code Playgroud)
我试着使用以下查询
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
Run Code Online (Sandbox Code Playgroud)
但结果不完整; 缺少行,哪些位置详细信息存储在LocationIDFrom和LocationIDTo的Location表中.
有没有人知道如何修改上面的查询或编写正确的一个返回具有位置名称的表,必须从相同的表中检索LocationFrom和LocationTo而不是ID?
在这里,我找到了类似问题的解决方案,但不知道为什么该原理不适用于上述问题.