【发布时间】:2015-05-04 01:35:03
【问题描述】:
我有两个类似于以下的表:
个人资料表
身份证 |服务标识 |访问权限 ---------------------------- 1 | 123 | 1 2 | 123 | 1 3 | 123 | 2附加配置文件表(ProfileId 是 Profile.Id 的外键)
身份证 |个人资料 ID |访问权限 ---------------------------- 1 | 1 | 2 2 | 1 | 3 3 | 2 | 2 4 | 3 | 3我目前有一个在这两个表上执行 UNION ALL 的视图,以便我可以查询它“ProfileId = 1”并获得以下结果集:
个人资料 ID |服务标识 |访问权限 ---------------------------------- 1 | 123 | 1 1 | 123 | 2 1 | 123 | 3这似乎很慢。
所以,我想知道是否/如何使用单个查询获得相同的结果集,但我正在努力寻找一种方法。
任何帮助将不胜感激。
视图后面的查询:
SELECT Id, ServiceId, AccessLevel FROM Profile
UNION ALL
SELECT P.Id, P.ServiceId, A.AccessLevel
FROM Profile P
INNER JOIN AdditionalProfile A ON A.ProfileId = P.Id
每个表包含大约。 160,000 条记录。
【问题讨论】:
-
需要FULL OUTER JOIN(如果任何表为空。)我猜UNION ALL 更好...你确定它很慢吗?!?
-
如果您的查询速度较慢,请发布 QUERY 和 QUERY PLAN、记录数等。没有人可以根据提供的信息帮助您优化它。
-
我已经从视图中添加了查询。
-
您希望获得什么样的性能(就经过的时间而言),您会得到什么?此外,您希望在查询单个 ID 或所有 ID 时看到最佳性能?
-
仅查看您的查询,我不明白您要做什么。那么,您想从
Profile表中选择所有行,然后从同一个Profile表中选择同样在AdditionalProfile中的记录,从而留下重复项?加快此速度的一种方法是让您的查询简单地SELECT p.Id, p.ServiceId, p.AccessLevel, a.Id FROM Profile P LEFT JOIN AdditionalProfile A on P.Id = A.ProfileId- 这将为您提供您正在寻找的相同数据,但结果集不同。第三列不是重复的,而是null或不是。
标签: sql tsql join union union-all