我可以在 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
相反,您需要使用 APPLY
。 CROSS APPLY
相当于 INNER JOIN
,OUTER 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
请看下面我的查询。我可以在 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
相反,您需要使用 APPLY
。 CROSS APPLY
相当于 INNER JOIN
,OUTER 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