SQL连接条件A = B或反向B = A?

时间:2009-05-15 14:52:53

标签: sql join

我认为这对数据库没有任何影响,但是在连接表时,您更喜欢编写条件:

SELECT
    ...
    FROM AAA
        INNER JOIN BBB ON AAA.ID=BBB.ID
    WHERE ...

OR

SELECT
    ...
    FROM AAA
        INNER JOIN BBB ON BBB.ID=AAA.ID
    WHERE ...

13 个答案:

答案 0 :(得分:8)

我更喜欢第二个例子(B = A),因为在连接中我列出了确定应包括哪些B行的标准。换句话说,我想要B中的所有行,其中“X”对于B是真的。当我需要检查超出FK的标准时,这也是一致的。例如:

SELECT
     some_columns
FROM
     Table_A A
INNER JOIN Table_B B ON
     B.a_id = A.a_id AND
     B.active = 1

在我看来,如果我有:

,它的可读性就不一样了
1 = B.active

另外,请考虑您加入条件的情况包括多个表:

SELECT
     some_columns
FROM
     Table_A A
INNER JOIN Table_B B ON
     B.a_id = A.a_id AND
     B.active = 1
INNER JOIN Table_C C ON
     C.a_id = A.a_id AND
     C.b_id = B.b_id AND
     C.category = 'Widgets'

对我来说,非常明确地说明了应该包含C行的标准。

答案 1 :(得分:6)

我更喜欢第二个选项,其中最近写的表首先出现。

我认为Linq要求它是另一种方式(选项1)。

答案 2 :(得分:4)

我总是这样做

From TABLE_A A

JOIN TABLE_B B ON A.Column = B.Column

答案 3 :(得分:3)

这并不重要,两者都是正确的。我的偏好是第二个。

我的偏好是基于表BBB是我正在添加到结果集中的表的想法,并且手头的工作是将新表BBB中的列(表达式)绑定到结果集中已有的其他列。在另一个例子中可能更有意义:

SELECT ...
  FROM AAA a
  JOIN BBB b ON (b.AAA_ID = a.ID)
  JOIN CC c ON (c.AAA_ID = b.AAA_ID AND UPPER(c.FEE) IN ('FI','FO'))
  JOIN DDD d ON (d.CC_ID = c.ID AND LEFT(d.DAH,2) = c.FEE)

是的,这是一个非常复杂的例子,但有时真正的代码会让这变得复杂。当在连接条件中引用多个谓词时,我发现当每个谓词首先(在左侧)引用最近加入的表中的表达式时,它会很有用。

还有其他模式也有帮助,例如,当每个表的主键是一个名为“ID”的列时,外键列通常被命名为PARENTTABLE_ID,这样当我看到像a.ID这样的结构时= b.ID,我看到的是加入主键的主键模式(一对一的关系,这不是规范模式)。当我看到b.FOREIGN_ID = c.FOREIGN_ID时,我看到的是外键加入外键。同样,不是通常的模式,表明这可能是多对多连接,或者可能是性能的快捷连接。我在父子联接中寻找的通常模式就像child.PARENT_ID = parent.ID

这些模式不对或错,只是偏好。我发现这些模式不会使代码看起来很漂亮,但确实使得“奇怪”的代码脱颖而出。

答案 4 :(得分:2)

我更喜欢第一种选择。你从A到B,所以字段的顺序似乎更合适。

答案 5 :(得分:2)

我不认为这确实有所作为,但我更喜欢

INNER JOIN BBB ON AAA.ID=BBB.ID

因为它与linq一致。

答案 6 :(得分:2)

另一个温和的声音为AAA.ID = BBB.ID.这对我来说似乎更有意义,但这并不重要。

然而,在一个相切相关的说明中,我最近开始质疑如何编写相等测试。我一直偏好:

If ValueInQuestion = TestValue Then
...

即,

If fullMoonsThisMonth = 2 Then
...

在其他人的代码中,我经常看到这个测试发生逆转,并且它让我感到困惑了一段时间。我开始意识到我的偏好是以英语为基础,在英语中哪个公式听起来“更好”,并且有时候有充分的理由将不变的版本放在左边。在只有一个运算符进行相等性测试和赋值的语言中(例如VB,如果您没有识别样本......),编译器将阻止您在意图进行测试时意外地进行赋值。

答案 7 :(得分:1)

没有区别,但为了清晰起见,我会选择AAA.ID = BBB.ID上的“AAA INNER JOIN BBB”(但使用别名)

答案 8 :(得分:1)

我使用第一种语法AAA.ID = BBB.ID.由于加入参与者遵循表格顺序,因此我认为代码更容易阅读。

答案 9 :(得分:1)

我倾向于使用两者,因为它根本没有任何区别。

答案 10 :(得分:0)

只要在查询中已经提到过您引用的表,您编写连接的顺序无关紧要。

我个人更喜欢列出最新的第二个表格(选项1)。这个约定很有帮助,因为我已经决定在需要的时候总是使用LEFT OUTER JOIN(而不是RIGHT OUTER JOIN),而且我不必考虑右边或左边的哪个表。

答案 11 :(得分:0)

让我们记住 LINQ不是SQL ,为什么它在这里被提到?不应该用LINQ答案来回答SQL问题。在我看来,这只是奇怪而且无关紧要!!

这两个例子都可以接受。我更喜欢第二个例子,就像大多数SQL开发人员一样。它还取决于您要使用的SQL JOIN的类型。问题标题仅用于“JOIN”,但您的示例使用INNER JOIN。

在这种情况下,对于INNER JOIN,无所谓。但请记住,两个示例都会生成HASH MATCHED JOIN,这在处理索引时并不理想。 循环连接效率更高。只需确保将索引视为哈希联接是低效索引的指标。

答案 12 :(得分:0)

根据两个表的索引方式以及它们加入的字段,它是否会产生性能差异?

某些数据库引擎中的查询优化器可能能够做正确的事情,无论您指定的是什么顺序,但只有一些时间与查询计划和测试肯定会回答。