为什么这会使连接评估为交叉连接?

Joh*_*ven 3 sql sql-server

假设我有一个带有列(Alpha,Beta)的表A,它与列B(Beta,Delta,Gamma)链接到表B. 我无法解释为什么第一个查询转换为交叉连接.(A.Alpha,A.Beta和B.Delta是唯一的键.B.Beta仰视A.Beta).

如果我选择这样的:

SELECT A.Alpha, B_Alias.Gamma FROM A 
LEFT JOIN B as B_Alias ON B_Alias.Delta = (
  SELECT TOP 1 B_Alias.Delta FROM B 
  WHERE B.Beta = B_Alias.Beta
  ORDER BY B.Gamma desc)
where A.Alpha = 1
Run Code Online (Sandbox Code Playgroud)

结果是很多行,A.Alpha总是等于所选的单行和B_Alias.Gamma有每个Gamma.如果我取出它A.Alpha = 1,那么它是一个完整的交叉连接.查询的编写者尝试获取与A关联的最新B列(如果存在).我通过使用以下内容将其修复为工作.我只是想知道是否有人可以解释为什么上述工作方式.

-- This is the correct query
SELECT A.Alpha, B_Alias.Gamma FROM A 
-- Actually join the A and B tables
LEFT JOIN B on B.Beta = A.Beta and B.Delta = (
  -- Only get the Most Recent B for any given A
  SELECT TOP 1 B.Delta FROM B 
  WHERE B.Beta = A.Beta
  ORDER BY B.Gamma desc)
where A.Alpha = 1
Run Code Online (Sandbox Code Playgroud)

Jer*_*ore 6

顶部查询有没有条件ON,其涉及条款AB.你在做什么正在采取每一行从B具有顶部Delta被下令Gamma为它的Beta行,并加入该结果设定为每行A.你实际上是把一个子集B(它将等于Bif Beta是唯一的)并交叉加入它,A因为你没有在A和之间指定任何直接关系B.

就像更详细一点,如果你拿任何表并将它加入到你没有的任何其他表中TableA.SomeColumn = TableB.SomeColumn,你基本上只需要从中得到完整的结果集TableB,然后将完整的结果集连接到每一行in TableA,因为它无法限制连接到行中的结果集TableA.我希望有所帮助.