在SQL中使用联接时的重复记录-图像数据

时间:2018-08-10 15:23:21

标签: sql sql-server join duplicates

我遇到一个问题,其中具有简单联接的查询返回重复记录。这是我的代码:

SELECT DR.DOCUMENTNAME, DR.REVISIONNUMBER, BD.DOCUMENTDATA
FROM DOCUMENTREVISION DR LEFT JOIN
     BINARYDOCUMENT BD
     ON DR.DOCUMENTARCHIVENUMBER = BD.DOCUMENTSUBGROUP
WHERE BD.DOCUMENTSUBGROUP = '160200001'`

这将返回:

View Results Here

请注意,由于DocumentData列是图像数据类型,因此我无法使用distinct。任何帮助表示赞赏。谢谢

2 个答案:

答案 0 :(得分:0)

好吧,LEFT JOIN是不必要的,因为WHERE撤消了该操作。

我猜测重复项来自JOIN。如果是这样,您可以使用子查询来执行您想要的操作。我认为这样会起作用:

SELECT DR.DOCUMENTNAME, DR.REVISIONNUMBER,
       (SELECT BD.DOCUMENTDATA
        FROM  BINARYDOCUMENT BD
        WHERE DR.DOCUMENTARCHIVENUMBER = BD.DOCUMENTSUBGROUP
        FETCH FIRST 1 ROW ONLY
       ) as DOCUMENTDATA
FROM DOCUMENTREVISION DR 
WHERE DR.DOCUMENTARCHIVENUMBER = '160200001';

这仅返回BINARYDOCUMENT中的一个匹配项。

注意:FETCH FIRST 1 ROW ONLY是ANSI标准的语法,许多数据库都支持,但并非所有数据库都支持。有些使用LIMIT,有些使用SELECT TOP

答案 1 :(得分:0)

这是从其他解决方案中获得的,但仅对TOP子句进行了少许修改:

SELECT DR.DOCUMENTNAME, DR.REVISIONNUMBER,
       (SELECT TOP (1) BD.DOCUMENTDATA
        FROM  BINARYDOCUMENT BD
        WHERE DR.DOCUMENTARCHIVENUMBER = BD.DOCUMENTSUBGROUP
       ) as DOCUMENTDATA
FROM DOCUMENTREVISION DR 
WHERE DR.DOCUMENTARCHIVENUMBER = '160200001';

您也可以使用APPLY来简化:

SELECT DR.DOCUMENTNAME, DR.REVISIONNUMBER, BD.DOCUMENTDATA
FROM DOCUMENTREVISION DR OUTER APPLY
     ( SELECT TOP (1) BD.DOCUMENTDATA
       FROM  BINARYDOCUMENT BD
       WHERE DR.DOCUMENTARCHIVENUMBER = BD.DOCUMENTSUBGROUP
     ) BD;
WHERE DR.DOCUMENTARCHIVENUMBER = '160200001';