请考虑在Sql Server中的以下两个语句:
这个使用了嵌套子查询:
```sql SELECT * FROM table1 WHERE id IN (SELECT id FROM table2 WHERE condition) ```
```sql SELECT * FROM table1 INNER JOIN table2 ON table1.id = table2.id WHERE condition ```
这个使用了嵌套子查询:
```sql SELECT * FROM table1 WHERE id IN (SELECT id FROM table2 WHERE condition) ```
This one is using Join:
这个使用了连接:```sql SELECT * FROM table1 INNER JOIN table2 ON table1.id = table2.id WHERE condition ```
WITH cte AS
(
SELECT TOP 100 PERCENT *
FROM Segments
ORDER BY InvoiceDetailID, SegmentID
)
SELECT *, ReturnDate =
(SELECT TOP 1 cte.DepartureInfo
FROM cte
WHERE seg.InvoiceDetailID = cte.InvoiceDetailID
AND cte.SegmentID > seg.SegmentID),
DepartureCityCode =
(SELECT TOP 1 cte.DepartureCityCode
FROM cte
WHERE seg.InvoiceDetailID = cte.InvoiceDetailID
AND cte.SegmentID > seg.SegmentID)
FROM Segments seg
这里使用了OUTER APPLY运算符:
WITH cte AS
(
SELECT TOP 100 PERCENT *
FROM Segments
ORDER BY InvoiceDetailID, SegmentID
)
SELECT seg.*, t.DepartureInfo AS ReturnDate, t.DepartureCityCode
FROM Segments seg OUTER APPLY (
SELECT TOP 1 cte.DepartureInfo, cte.DepartureCityCode
FROM cte
WHERE seg.InvoiceDetailID = cte.InvoiceDetailID
AND cte.SegmentID > seg.SegmentID
) t
考虑到两个Segments表都可能有数百万行,哪一个潜在地表现更好?
我的直觉是OUTER APPLY会表现得更好。
还有几个问题:
- 我相当确定这一点,但仍想确认一下,在第一种解决方案中,CTE将被有效地执行两次(因为它被引用了两次,而且CTE像宏一样扩展)。
- 在使用OUTER APPLY运算符时,每行都会执行CTE吗?在第一个语句的嵌套查询中使用时,每行都会执行吗?
ROW_NUMBER
和PARTITION BY
来获取每个组的TOP 1
。 - Martin Smith