假设我有一个带有列(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
答案 0 :(得分:6)
热门查询在ON
条款中没有条件将A
与B
相关联。您正在做的是从B
获取Delta
排序Gamma
的每一行为Beta
行,并将该结果集加入A
行中的每一行{1}}。您基本上是B
的一部分(如果B
是唯一的,则等于Beta
)并将其交叉连接到A
,因为您尚未指定A
和B
之间的直接关系。
更详细一点,如果你拿任何表并将其加入到没有TableA.SomeColumn = TableB.SomeColumn
的任何其他表中,你基本上只需从TableB
得到完整的结果集即可受限制,然后将完整的结果集连接到TableA
中的每一行,因为它无法限制连接到TableA
中的行的结果集。我希望有所帮助。