我认为这对数据库没有任何影响,但是在连接表时,您更喜欢编写条件:
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 ...
答案 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)
根据两个表的索引方式以及它们加入的字段,它是否会产生性能差异?
某些数据库引擎中的查询优化器可能能够做正确的事情,无论您指定的是什么顺序,但只有一些时间与查询计划和测试肯定会回答。