在同一张桌子上两次联接的最佳方法是什么?

这有点复杂,但是我有2个表。假设结构是这样的:


*Table1*

ID

PhoneNumber1

PhoneNumber2


*Table2*

PhoneNumber

SomeOtherField

可以基于Table1.PhoneNumber1-> Table2.PhoneNumber或Table1.PhoneNumber2-> Table2.PhoneNumber联接表。


现在,我想获得一个包含PhoneNumber1,与PhoneNumber1,PhoneNumber2对应的SomeOtherField和与PhoneNumber2对应的SomeOtherField的结果集。


我想到了两种方法来执行此操作-通过在表上联接两次或通过在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

这似乎有效。


方法2:


某种程度上看起来像这样的查询-


SELECT ...

FROM Table1

INNER JOIN Table2 

   ON Table1.PhoneNumber1 = Table2.PhoneNumber OR

      Table1.PhoneNumber2 = Table2.PhoneNumber

我还没有开始工作,我不确定是否有办法做到这一点。


做到这一点的最佳方法是什么?这两种方法看起来都不是简单或直观的……是否有更直接的方法来做到这一点?一般如何实施此要求?


UYOU
浏览 571回答 3
3回答

慕姐4208626

除非Phone1或(更可能是)phone2可以为null,否则第一个是好的。在这种情况下,您要使用左联接而不是内部联接。当您有一个包含两个电话号码字段的表时,通常这是一个不好的信号。通常,这意味着您的数据库设计存在缺陷。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

SQL Server