У меня проблема, когда запрос с простым соединением возвращает повторяющиеся записи. Вот код, который у меня есть:
SELECT DR.DOCUMENTNAME, DR.REVISIONNUMBER, BD.DOCUMENTDATA
FROM DOCUMENTREVISION DR LEFT JOIN
BINARYDOCUMENT BD
ON DR.DOCUMENTARCHIVENUMBER = BD.DOCUMENTSUBGROUP
WHERE BD.DOCUMENTSUBGROUP = '160200001'`
Это возвращает:
В качестве примечания, я не могу использовать отдельный, поскольку столбец DocumentData является типом данных изображения. Любая помощь приветствуется. Спасибо
Я в среде SSMS- 17
Какие данные есть в archiveNumber и DocumentSubGroup? Это те столбцы, к которым вы присоединяетесь, но не отображаются в вопросе.
Как вы думаете, чем мы можем помочь, если вы не дадите структуру таблиц ???
В основном эти две таблицы содержат информацию о документах для проектов. Номер архива и подгруппа документов - это просто номера заданий, к которым я присоединяюсь.
Что ж, 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
.
Спасибо за помощь. Я получаю синтаксическую ошибку в операторе Fetch «Недопустимое использование параметра FIRST в операторе FETCH». При наведении указателя мыши на FETCH появляется надпись "ожидаю", EXCEPT OR UNION.
@UsmanAhmed. . . Как упоминалось в ответе, используйте соответствующую логику для своей базы данных (которая не была помечена, когда я ответил). И, к сведению, SQL Server уже много лет поддерживает FETCH
.
Это из другого решения, но с небольшой модификацией с предложением 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';
Отметьте СУБД (например,
MySQL
,SQL Server
и т. д.), Которую вы используете.