Повторяющиеся записи при использовании объединений в SQL - данные изображения

У меня проблема, когда запрос с простым соединением возвращает повторяющиеся записи. Вот код, который у меня есть:

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

Это возвращает:

Повторяющиеся записи при использовании объединений в SQL - данные изображения

В качестве примечания, я не могу использовать отдельный, поскольку столбец DocumentData является типом данных изображения. Любая помощь приветствуется. Спасибо

Отметьте СУБД (например, MySQL, SQL Server и т. д.), Которую вы используете.

Yogesh Sharma 10.08.2018 17:26

Я в среде SSMS- 17

Manny 10.08.2018 17:39

Какие данные есть в archiveNumber и DocumentSubGroup? Это те столбцы, к которым вы присоединяетесь, но не отображаются в вопросе.

Daniel Gale 10.08.2018 17:44

Как вы думаете, чем мы можем помочь, если вы не дадите структуру таблиц ???

Eric 10.08.2018 17:55

В основном эти две таблицы содержат информацию о документах для проектов. Номер архива и подгруппа документов - это просто номера заданий, к которым я присоединяюсь.

Manny 10.08.2018 18:00
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
5
63
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Что ж, 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.

Manny 10.08.2018 17:37

@UsmanAhmed. . . Как упоминалось в ответе, используйте соответствующую логику для своей базы данных (которая не была помечена, когда я ответил). И, к сведению, SQL Server уже много лет поддерживает FETCH.

Gordon Linoff 10.08.2018 21:20
Ответ принят как подходящий

Это из другого решения, но с небольшой модификацией с предложением 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';

Другие вопросы по теме