2

连接两个表时,下面的两个块有什么区别,哪个是更好的方法?

模式 A:

SELECT ...
FROM A
    INNER JOIN B
        ON A.PK = B.FK
WHERE 1=1
    AND A.Name = "Foo"
    AND B.Title = "Bar"

模式 B:

SELECT ...
FROM A
    INNER JOIN B
        ON A.PK = B.FK
            AND B.Title = "Bar"
WHERE 1=1
    AND A.Name = "Foo"
4

4 回答 4

13

这会因人而异,但我认为模式 A 更好。

它的作用是将表级连接与过滤器分开。这对于具有多个连接和多个过滤器的查询可能很有帮助,因为它清楚地将正在进行的两种连接类型分开。

于 2009-08-05T16:29:51.780 回答
4

我更喜欢模式 A,但可能没有任何区别。您确实必须查看执行计划以确保它有效运行。

于 2009-08-05T16:30:38.923 回答
3

如果用 替换INNER JOINOUTER JOIN会有区别。

否则,这些查询:

SELECT  ...
FROM    A
INNER JOIN
        B
ON      A.PK = B.FK
WHERE   A.Name = "Foo"
        AND B.Title = "Bar"

SELECT  ...
FROM    A
INNER JOIN
        B
ON      A.PK = B.FK
        AND B.Title = "Bar"
WHERE   A.Name = "Foo"

SELECT  *
FROM    A, B
WHERE   B.Title = "Bar"
        AND A.Name = "Foo"
        AND A.PK = B.FK

是相同的。

Oracle, MySQL,PostgeSQL并且SQL Server会以完全相同的方式对待它们,并对它们使用完全相同的计划。

我会用这个:

SELECT  ...
FROM    A
INNER JOIN
        B
ON      B.FK = A.PK
WHERE   A.Name = "Foo"
        AND B.Title = "Bar"

如果有一个单列键B.FK,并且这个:

SELECT  ...
FROM    A
INNER JOIN
        B
ON      B.FK = A.PK
        AND B.Title = "Bar"
WHERE   A.Name = "Foo"

如果有一个复合键(B.FK, B.title)

在这种情况下,连接条件更加直观。

于 2009-08-05T16:35:51.550 回答
0

我可能错了,但我认为第一种方法是一种更有效的方法。您的查询是由内而外执行的。因此,当您首先运行连接时,它会运行得更快,因为它必须匹配(可能索引的)PK 和 FK 字段,而不是像您的 Title 字段(可能是 varchar,使匹配更慢)这样的无关内容。因此,当您到达过滤 where 子句时,您可以执行匹配的数据较少。总的猜测。我想知道其他人会怎么说。看到这方面的执行计划不会有什么坏处:)

于 2009-08-05T16:33:22.820 回答