如何减少 SQL 视图中的子查询
How to reduce subqueries in a SQL View
我有一个包含多个子查询的查询,它正在减慢速度。许多子查询是相同的记录但不同的字段。我想知道是否有一种方法可以查询该记录一次而不是四次。
例如:
select
field1 as (select field1 from people where company = g.company),
field2 as (select field2 from people where company = g.company),
field3 as (select field3 from people where company = g.company),
field4 as (select field4 from people where company = g.company)
from peopleGroup g
SELECT子句中的子查询有它的用处,但一般都是异常解决问题。相反,做你正在做的事情的正确方法是在你的 FROM 子句中正确地加入你的两个表:
SELECT people.field1, people.field2, people.field3, people.field4
FROM peopleGroup g
LEFT OUTER JOIN people
ON g.company = people.company
如果出于某种原因你仍然想进行子查询(比如 TOP 1
),那么你可以使用 APPLY
select
p.field1,
p.field2,
p.field3,
p.field4
from peopleGroup g
outer apply (
select
p.field1,
p.field2,
p.field3,
p.field4
from people p
where p.company = g.company
) p;
OUTER APPLY
模拟一个LEFT JOIN
,CROSS APPLY
模拟一个INNER JOIN
我有一个包含多个子查询的查询,它正在减慢速度。许多子查询是相同的记录但不同的字段。我想知道是否有一种方法可以查询该记录一次而不是四次。
例如:
select
field1 as (select field1 from people where company = g.company),
field2 as (select field2 from people where company = g.company),
field3 as (select field3 from people where company = g.company),
field4 as (select field4 from people where company = g.company)
from peopleGroup g
SELECT子句中的子查询有它的用处,但一般都是异常解决问题。相反,做你正在做的事情的正确方法是在你的 FROM 子句中正确地加入你的两个表:
SELECT people.field1, people.field2, people.field3, people.field4
FROM peopleGroup g
LEFT OUTER JOIN people
ON g.company = people.company
如果出于某种原因你仍然想进行子查询(比如 TOP 1
),那么你可以使用 APPLY
select
p.field1,
p.field2,
p.field3,
p.field4
from peopleGroup g
outer apply (
select
p.field1,
p.field2,
p.field3,
p.field4
from people p
where p.company = g.company
) p;
OUTER APPLY
模拟一个LEFT JOIN
,CROSS APPLY
模拟一个INNER JOIN