我可以在 INNER JOIN 中访问 SELECT 中使用的 table.id

Can I access table.id used in SELECT in INNER JOIN

请看下面我的查询。我可以在 INNER JOIN 中访问“numbers.id”,这样我就可以写:(注意 WHERE numberID = numbers.id)

INNER JOIN (SELECT TOP 1 numberID, cbListReason, cbListReasonVoteCount 
FROM reasons WHERE numberID = numbers.id  
GROUP BY 
    numberID, cbListReason, cbListReasonVoteCount 
ORDER BY cbListReasonVoteCount DESC) groupedReasons

而那下面是怎么回事?我不是很精通 SQL,虽然我有索引并且可以看到执行计划使用它,但我认为在 INNER JOIN 中选择 numbers.id 会使它更快。

我错了吗?
谢谢

查询:

SELECT
    numbers.*,
    groupedReasons.cbListReason,
    groupedReasons.cbListReasonVoteCount
FROM
    numbers
    INNER JOIN (
        SELECT
            TOP 1 numberID,
            cbListReason,
            cbListReasonVoteCount
        FROM
            reasons
        GROUP BY
            numberID,
            cbListReason,
            cbListReasonVoteCount
        ORDER BY
            cbListReasonVoteCount DESC
    ) groupedReasons ON numbers.id = groupedReasons.numberID
WHERE
    userCountry = @userCountry
    AND numbers.nationalNumber = @nationalNumber
    AND numbers.reportCount > @minimumReportCount
ORDER BY
    groupedReasons.cbListReasonVoteCount DESC

不,您不能在 JOIN 子句中引用其他对象,只能在 ON 中引用。这意味着像下面这样的语法将失败:

FROM dbo.Table1 T1
     JOIN (SELECT TOP (1) * FROM dbo.Table2 T2 WHERE T1.C = T2.C ORDER BY S) ON T1.I = T2.I

而且,对于 TVF 也会失败:

FROM dbo.Table1 T1
     CROSS JOIN dbo.TVF(T1.I) TVF

相反,您需要使用 APPLYCROSS APPLY 相当于 INNER JOINOUTER APPLY 相当于 LEFT JOIN。因此,对于上面的内容,您可能会有如下语句:

FROM dbo.Table1 T1
    CROSS APPLY (SELECT TOP (1) * FROM dbo.Table2 T2 WHERE T1.C = T2.C AND T1.I = T2.C ORDER BY S) T2
--Or
FROM dbo.Table1 T1
     OUTER APPLY dbo.TVF(T1.C) TVF