SQL-从左连接中删除重复项

标签 sql sql-server join

我正在创建两个表的联接 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/

相关文章:

c# - 如何在 C# 中做更快的插入查询?

SQL Server 选择排名数据的第一个实例

sql-server - 在 SQL 中使用 ISNULL 的可控制查询

mysql - Codeigniter 模型,根据 table1 从 2 个表中获取值。如果在 table2 上找不到值,则值返回 null

mysql - 有没有办法为某一列选择一定数量的行?

sql - 使用 select 时格式化 sql 列

sql - 数组和连接之间的 Postgresql 性能比较

sql - MSSQL : Only last entry in GROUP BY (with id)

python - csvjoin 多列

MySQL - 检索特定计数