我遇到一个问题,其中具有简单联接的查询返回重复记录。这是我的代码:
SELECT DR.DOCUMENTNAME, DR.REVISIONNUMBER, BD.DOCUMENTDATA
FROM DOCUMENTREVISION DR LEFT JOIN
BINARYDOCUMENT BD
ON DR.DOCUMENTARCHIVENUMBER = BD.DOCUMENTSUBGROUP
WHERE BD.DOCUMENTSUBGROUP = '160200001'`
这将返回:
请注意,由于DocumentData列是图像数据类型,因此我无法使用distinct。任何帮助表示赞赏。谢谢
答案 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';