【发布时间】:2017-12-07 17:11:15
【问题描述】:
例如,我有 2 个表用于查询,Property 和 Move 用于移动属性的历史记录。
我必须创建一个查询,该查询将返回所有属性 + 1 个额外的布尔列 IsInService,如果 Move 表有 DateTo = null 和 @ 的属性记录,它将具有值 true 987654332@(“服务中”)。
我创建了这个查询:
SELECT
[ID], [Name],
(SELECT COUNT(*)
FROM [Move]
WHERE PropertyID = p.ID
AND DateTo IS NULL
AND MoveTypeID = 1) AS IsInService
FROM
[Property] as p
ORDER BY
[Name] ASC
OFFSET 100500 ROWS FETCH NEXT 50 ROWS ONLY;
我的 SQL 不是那么强,但据我所知,子查询是邪恶的 :)
如果预计这些表将包含数百万条记录,如何在我的情况下创建高性能 SQL 查询?
【问题讨论】:
-
改用连接,看看效果如何。
-
我不知道我必须使用哪个连接以及我必须如何使用才能获得我需要的结果
-
类似:
select ID, Name, Count(*) as IsInService from Property p join Move m on p.ID = m.PropertyID where m.DateTo is null and m.MoveTypeID = 1 order by [Name] ASC OFFSET 100500 ROWS FETCH NEXT 50 ROWS ONLY; -
也许你会用
exists做得更好,例如:case when exists ( select 42 from ... ) then 1 else 0 end as IsInService。 -
@CodingYoshi 不行
标签: sql-server tsql subquery query-performance