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

SQL连接条件A=B或反向为B=A?,sql,join,Sql,Join,我认为这不会对数据库造成任何影响,但在连接表时,您更喜欢按哪个顺序编写条件: SELECT ... FROM AAA INNER JOIN BBB ON AAA.ID=BBB.ID WHERE ... 或 我喜欢第一种选择。您将从A转到B,因此字段的顺序似乎更合适。我更喜欢第二个选项,其中最新编写的表位于第一位 不过,我认为Linq要求相反(选项1)。我总是这样做 From TABLE_A A JOIN TABLE_B B ON A.Column =

我认为这不会对数据库造成任何影响,但在连接表时,您更喜欢按哪个顺序编写条件:

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


我喜欢第一种选择。您将从A转到B,因此字段的顺序似乎更合适。

我更喜欢第二个选项,其中最新编写的表位于第一位

不过,我认为Linq要求相反(选项1)。

我总是这样做

From TABLE_A A

JOIN TABLE_B B ON A.Column = B.Column

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

我使用了第一个语法AAA.ID=BBB.ID。在我看来,这使代码更容易阅读,因为加入参与者遵循表的顺序。

我认为这并没有什么区别,但我更喜欢

INNER JOIN BBB ON AAA.ID=BBB.ID

因为它与linq一致。

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

然而,与此相关的是,我最近开始质疑我如何编写平等测试。我一直喜欢:

If ValueInQuestion = TestValue Then
...
就是

If fullMoonsThisMonth = 2 Then
...

在其他人的代码中,我经常看到这个测试被逆转,并且它在一段时间内对我进行了窃听。我开始意识到我的偏好是基于soleley的,soleley的公式在英语中听起来“更好”,而且有时有很好的理由将不变符放在左边。在等式测试和赋值都只有一个运算符的语言中(例如VB,如果您不识别样本…),编译器将阻止您在打算进行测试时意外地进行赋值。

我倾向于同时使用这两种运算符,因为这两种语言没有任何区别

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

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中哪些行应该包含在标准中。

这其实并不重要,两者都是正确的。我更喜欢第二种

我的偏好是基于这样的想法:表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\u ID=c.FOREIGN\u ID时,我看到的是一个外键连接到一个外键。同样,不是通常的模式,这表明这可能是多对多连接,或者可能是一个性能快捷连接。我在父子连接中寻找的通常模式类似于child.parent\u ID=parent.ID


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

只要查询中已经提到了您引用的表,那么编写连接的顺序就无关紧要了


我个人更喜欢将最近的表列在第二位(选项1)。这种约定很有帮助,因为我决定在需要时总是使用左外部联接(而不是右外部联接)我不必考虑哪个表在右边或左边。

让我们记住这里LINQ不是SQL,那么为什么这里还要提到它呢?SQL问题不应该用LINQ答案来回答。在我看来,这很奇怪,也很不相关

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

在本例中,对于内部连接来说,这并不重要。但请记住,这两个示例都会生成哈希匹配的连接,这在处理索引时并不理想。
循环连接更有效。只需确保您的索引作为散列连接是低效索引的一个指标。

< P>不能根据两个表如何被索引以及它们加入哪些字段而产生性能差异?


某些DB引擎中的查询优化器可能能够做正确的事情,而不管您指定的顺序如何,但只有在查询计划和测试的某些时间才能确定答案。

@Michael Haren,我更喜欢A=B,但你不是唯一的一个。我问这个问题是为了看看我是否疯了,我的许多同事都使用B=A!+1你是not是唯一的一种。是的,LINQ需要第二种格式。这里也要说明一下……从AAA中选择*怎么样,其中AAA.ID=BBB.IDT Pops我不建议任何人使用这种语法。它已经过时17年了,更容易出错(意外交叉连接)而且更难理解和维护。如果不使用实际的连接子句,也不可能进行某些类型的复杂连接。有趣的是,只有两个选项,而且已经有十个答案。我发现有趣的是,在许多人解释了他们为什么选择每种方式后,选择的“正确”答案只是
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)