我正在创建两个表的联接 View ,但从 table2 中得到不需要的重复项。
例如:table1 有 9000 条记录,我需要结果 View 包含完全相同的记录; table2 可能有多条具有相同 FKID 的记录,但我只想返回一条记录(我的客户可以随机选择)。我的以下代码可以正常工作,但性能低于预期(超过 14 秒)。
SELECT
OBJECTID
, PKID
,(SELECT TOP (1) SUBDIVISIO
FROM dbo.table2 AS t2
WHERE (t1.PKID = t2.FKID)) AS ProjectName
,(SELECT TOP (1) ASBUILT1
FROM dbo.table2 AS t2
WHERE (t1.PKID = t2.FKID)) AS Asbuilt
FROM dbo.table1 AS t1
有没有办法通过连接做类似的事情来提高性能?
我使用的是 SQL Server 2008 R2。
我接近了以下代码(~.5 秒),但“Distinct”仅在所有列都重复(而不仅仅是 FKID)时过滤掉记录。
SELECT
t1.OBJECTID
,t1.PKID
,t2.ProjectName
,t2.Asbuilt
FROM dbo.table1 AS t1
LEFT JOIN (SELECT
DISTINCT FKID
,ProjectName
,Asbuilt
FROM dbo.table2) t2
ON t1.PKID = t2.FKID
表格示例
table1 table2
OID, PKID FKID, ProjectName, Asbuilt
1, id1 id1, P1, AB1
2, id2 id1, P5, AB5
3, id4 id2, P10, AB2
5, id5 id5, P4, AB4
在上面的示例中,返回的记录应为 id5/P4/AB4、id2/P10/AB2 和 (id1/P1/AB1 OR id1/P5/AB5)
我的搜索出现了类似的问题,但没有一个能解决我的问题。 link , link
在此先感谢您的帮助。这是我的第一篇文章,所以如果我违反了任何规则,请告诉我。
最佳答案
这将给出您所要求的结果,并且应该具有最佳性能。
SELECT
OBJECTID
, PKID
, t2.SUBDIVISIO,
, t2.ASBUILT1
FROM dbo.table1 AS t1
OUTER APPLY (
SELECT TOP 1 *
FROM dbo.table2 AS t2
WHERE t1.PKID = t2.FKID
) AS t2
关于SQL-从左连接中删除重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14615032/