Sql server 规划WHERE子句。@stakx我刚刚添加了一些附加信息(在答案的末尾),感谢这个例子,并确认DISTINCT确实会使所有三个查询返回相同的结果。关于为什么查询优化器不更智能,我故意避免这样问这个问题,因为答案应该是“因为它不是”。(正如Eric Lipp
Sql server 规划WHERE子句。@stakx我刚刚添加了一些附加信息(在答案的末尾),感谢这个例子,并确认DISTINCT确实会使所有三个查询返回相同的结果。关于为什么查询优化器不更智能,我故意避免这样问这个问题,因为答案应该是“因为它不是”。(正如Eric Lipp,sql-server,tsql,inner-join,Sql Server,Tsql,Inner Join,规划WHERE子句。@stakx我刚刚添加了一些附加信息(在答案的末尾),感谢这个例子,并确认DISTINCT确实会使所有三个查询返回相同的结果。关于为什么查询优化器不更智能,我故意避免这样问这个问题,因为答案应该是“因为它不是”。(正如Eric Lippert喜欢指出的关于C语言,特性不是默认实现的,也就是说,除非经过深思熟虑来实现它们。)我想换个角度问会更有价值,也就是说,如果有理由证明这种行为是有道理的。 CREATE TABLE y (Id INT NOT NULL PRIMARY K
规划
WHERE
子句。@stakx我刚刚添加了一些附加信息(在答案的末尾),感谢这个例子,并确认DISTINCT
确实会使所有三个查询返回相同的结果。关于为什么查询优化器不更智能,我故意避免这样问这个问题,因为答案应该是“因为它不是”。(正如Eric Lippert喜欢指出的关于C语言,特性不是默认实现的,也就是说,除非经过深思熟虑来实现它们。)我想换个角度问会更有价值,也就是说,如果有理由证明这种行为是有道理的。
CREATE TABLE y (Id INT NOT NULL PRIMARY KEY );
CREATE TABLE x (YId INT NOT NULL REFERENCES y (Id));
DECLARE @YId INT = …;
/* 1: */ SELECT x.* FROM x WHERE x.YId = @YId;
/* 2: */ SELECT x.* FROM x INNER JOIN y ON x.YId = @YId;
/* 3: */ SELECT x.* FROM x INNER JOIN y ON x.YId = y.Id WHERE y.Id = @YId;
<joined_table> ::=
{
<table_source> <join_type> <table_source> ON <search_condition>
| <table_source> CROSS JOIN <table_source>
| left_table_source { CROSS | OUTER } APPLY right_table_source
| [ ( ] <joined_table> [ ) ]
}
<join_type> ::=
[ { INNER | { { LEFT | RIGHT | FULL } [ OUTER ] } } [ <join_hint> ] ]
JOIN
SELECT
U.UserName, P.PrivilegeName, P.Status
FROM
dbo.Users U
LEFT JOIN dbo.Privileges P
ON U.UserID = P.UserID AND P.PrivilegeName = 'EditComment'
SELECT
U.UserName, P.PrivilegeName, P.Status
FROM
dbo.Users U
LEFT JOIN (SELECT UserID, Status FROM dbo.Privileges WHERE P.PrivilegeName = 'EditComment') P
ON U.UserID = P.UserID
SELECT
U.UserName, P.PrivilegeName, P.Status
FROM
dbo.Users U
LEFT JOIN dbo.Privileges P
ON U.UserID = P.UserID
WHERE
P.PrivilegeName = 'EditComment'
/* 4: */ SELECT x.* FROM x INNER JOIN y ON 1=1;
/* 5: */ SELECT x.* FROM x CROSS JOIN y
/* 6: */ SELECT x.* FROM x CROSS JOIN y WHERE x.YId = @YId
2 / SELECT x.* FROM x INNER JOIN y ON x.YId = @YId
select
tx.*
from
(
select x.* from x where x.YId = @YId
) tx
cross join y
declare @ty table (Id int not null primary key)
declare @tx table (Id Char(1) not null primary key, yId int not null)
insert into @ty values (1) ,(2), (3)
insert into @tx values ('A', 1), ('B', 1), ('C', 2)
declare @YId int = 1
SELECT x.* FROM @tx x WHERE x.YId = @YId
SELECT x.* FROM @tx x INNER JOIN @ty y ON x.yId = @YId
SELECT x.* FROM @tx x INNER JOIN @ty y ON x.YId = y.Id WHERE y.Id = @YId
A 1
B 1
A 1
A 1
A 1
B 1
B 1
B 1
A 1
B 1
insert into y values(1),(2);
insert into x values(1),(2);
YID
1
1