在from子句或where子句中进行equi连接是否更好?

AJM*_*AJM 11 sql t-sql sql-server sql-server-2005

在主键列上连接两个简单表并放置加法相等条件时,可以在join本身或where子句中完成.

例如,以下是等价的.我的问题是 - 有没有理由使用一种风格而不是另一种风格?

SELECT * 
FROM A
INNER JOIN B ON A.A_ID = B.A_ID
            AND A.DURATION = 3.00
Run Code Online (Sandbox Code Playgroud)

... VS:

SELECT * 
FROM A
INNER JOIN B ON A.A_ID = B.A_ID
WHERE A.DURATION = 3.00
Run Code Online (Sandbox Code Playgroud)

Mar*_*ith 10

一般来说,它没有语义差异.

虽然有一个边缘情况可以做.如果将(已弃用的)GROUP BY ALL构造添加到查询中,如下所示.

DECLARE @A TABLE(A_ID INT, DURATION DECIMAL(3,2) )
INSERT INTO @A VALUES(1,2.00)

DECLARE @B TABLE(A_ID INT)
INSERT INTO @B VALUES(1)

/*Returns one row*/
SELECT *
FROM @A A
INNER JOIN @B B ON A.A_ID = B.A_ID
WHERE A.DURATION = 3.00
GROUP BY ALL A.A_ID, A.DURATION, B.A_ID

/*Returns zero rows*/    
SELECT *
FROM @A A
INNER JOIN @B B ON A.A_ID = B.A_ID  AND A.DURATION = 3.00
GROUP BY ALL A.A_ID, A.DURATION, B.A_ID
Run Code Online (Sandbox Code Playgroud)


Dam*_*ver 9

这是一种风格问题.通常,您希望在FROM子句中放置定义结果集"形状"的条件(即控制每个表中的哪些行应该连接在一起以生成结果的条件),而过滤结果的那些条件set应该在WHERE子句中.对于INNER JOIN,效果相同,但一旦涉及OUTER JOIN(LEFT,RIGHT),感觉就会更加清晰.


在你的第一个例子中,我还在问"这与表B有什么关系?" 当我在JOIN中遇到这种奇怪的情况时.在第二个中,如果我不感兴趣,我可以跳过FROM子句(和所有JOIN),并且只看到确定是否将在WHERE子句中返回行的条件.


OMG*_*ies 6

重要的是JOIN的类型.
没有区别,所提供的查询版本都将使用相同的执行计划,因为您正在处理INNER JOIN.

如果处理OUTER JOIN(IE:LEFT,RIGHT),则两个版本之间存在巨大差异,因为在JOIN生成WHERE应用了条件.如果在子句中指定了条件,则 JOIN生成之前应用条件,这会在结果集之间产生相当大的差异.ON