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

时间:2012-04-09 16:01:20

标签: 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

结果是很多行,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

1 个答案:

答案 0 :(得分:6)

热门查询在ON条款中没有条件将AB相关联。您正在做的是从B获取Delta排序Gamma的每一行为Beta行,并将该结果集加入A行中的每一行{1}}。您基本上是B的一部分(如果B是唯一的,则等于Beta)并将其交叉连接到A,因为您尚未指定AB之间的直接关系。

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