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)
这是一种风格问题.通常,您希望在FROM子句中放置定义结果集"形状"的条件(即控制每个表中的哪些行应该连接在一起以生成结果的条件),而过滤结果的那些条件set应该在WHERE子句中.对于INNER JOIN,效果相同,但一旦涉及OUTER JOIN(LEFT,RIGHT),感觉就会更加清晰.
在你的第一个例子中,我还在问"这与表B有什么关系?" 当我在JOIN中遇到这种奇怪的情况时.在第二个中,如果我不感兴趣,我可以跳过FROM子句(和所有JOIN),并且只看到确定是否将在WHERE子句中返回行的条件.
重要的是JOIN的类型.
没有区别,所提供的查询版本都将使用相同的执行计划,因为您正在处理INNER JOIN.
如果处理OUTER JOIN(IE:LEFT,RIGHT),则两个版本之间存在巨大差异,因为在JOIN生成后WHERE
应用了条件.如果在子句中指定了条件,则在 JOIN生成之前应用条件,这会在结果集之间产生相当大的差异.ON