Удаление дубликатов из SQL-запроса в отношении «один ко многим»

У меня есть табличные отношения следующим образом:

Таблица 1 -> Таблица 2 (отношение один ко многим в БД)

Если я сделаю следующий запрос к таблице 1:

select *
from table1 as t1
where t1.id = 1 

Я получу только одну запись для конкретной записи из этой таблицы, но если я присоединюсь к таблице 2 следующим образом:

    select *
    from table1 as t1
    join table2 as t2
    on t1.id = t2.id
    where t1.id=1

На этот раз я получу несколько записей, если у меня есть идентификатор из таблицы 1, вставленный несколько раз в таблицу 2. Вопрос в том, есть ли способ показать только 1 запись после выполнения этого соединения в запросе, в отношениях один ко многим??

Может ли кто-нибудь помочь мне с этим?? Спасибо!

Я использовал способ koppinjo, и теперь запрос выглядит следующим образом:

SELECT  *
FROM    ( SELECT    ROW_NUMBER() OVER ( PARTITION BY PC.SubCategoryID 
                                     ORDER BY PC.[SubCategoryID] ) AS [Row]
                   ,sc.*
                   ,pc.MeasurementQuantity
                   ,pc.Price
                   ,pc.ProductCategoryID
                   ,pc.ProductID
                   ,p.Dimensions
                   ,p.FileName
                   ,p.ProductDescription
                   ,p.ProductName
                   ,mu.Unit
          FROM      SubCategory AS sc
                    JOIN ProductsCategories AS pc ON sc.SubCategoryID = pc.SubCategoryID
                    JOIN Products AS p ON p.ProductID = pc.ProductID
                    JOIN MeasurementUnits AS mu 
                          ON mu.MeasurementUnitID = p.MeasurementUnitID
          WHERE     pc.SubCategoryID = 1
        ) AS t
WHERE   t.[Row] = 1

Проблема в том, что запрос возвращает только 1 результат. Но что, если есть два продукта, которые относятся к одной и той же категории??

P.S. Я забыл упомянуть, что фактическая схема БД для этого запроса:

Товары -> ТоварыКатегории ‹- Категории

Итак, допустим, что 2 продукта находятся в двух категориях, мне нужно получить оба продукта, но без дубликатов. Способ Коппиньо возвращает только 1 результат...


person perkes456    schedule 13.05.2015    source источник
comment
Вы получаете несколько записей, поскольку есть несколько записей, соответствующих вашему критерию. Как sql serevr узнает, какие значения нужно получить из таблицы 2? вам нужно указать условие для фильтрации строк в таблице 2, которые имеют тот же идентификатор, что и t1.id.   -  person Zohar Peled    schedule 13.05.2015
comment
Как сказал Зоар Пелед, вам нужно указать, какие строки в таблице 2 вы хотите видеть. Например, вы хотите увидеть первую строку в таблице 2? Или самое большое значение? Вам нужно указать условие для фильтрации строк, или сделать группу, или что-то в этом роде.   -  person Danielle Paquette-Harvey    schedule 13.05.2015


Ответы (2)


Я бы предложил использовать оконную функцию, например ROW_NUMBER(). Например:

SELECT *
FROM (
      SELECT
          ROW_NUMBER() OVER (PARTITION BY t1.id ORDER BY t2.[primary/unique key]) AS [row]
         ,t1.*
      FROM table1 t1
          JOIN table2 t2 ON t1.id = t2.id
      WHERE t1.id = 1
     ) t
WHERE t.[row] = 1

Что-то вроде этого должно указать вам правильное направление. Надеюсь, поможет!

person How 'bout a Fresca    schedule 13.05.2015
comment
Не могли бы вы просмотреть мой обновленный вопрос. Я использовал ваш способ, но он не работает на 100%, и я не уверен, почему... - person perkes456; 13.05.2015
comment
Попробуйте изменить столбец ORDER BY (в части PARTITION BY запроса) на что-то другое, кроме PC.[SubCategoryID]. Обычно вы хотите заказать что-то вроде даты создания или идентификатора заказа - что-то, что имеет естественную кардинальность. - person How 'bout a Fresca; 13.05.2015
comment
Я изменил его, но по-прежнему возвращает только 1 результат... Проблема в том, что если два разных продукта находятся в одной и той же подкатегории? Этот запрос возвращает только один продукт за раз, но как отобразить их оба (если есть два продукта в одной категории). Это отношение многие ко многим... - person perkes456; 13.05.2015
comment
Может ли это быть связано с этим в вашем коде: где pc.SubCategoryID=1? Не имея хорошего представления о ваших данных, мне трудно дать совет, как структурировать функцию ROW_NUMBER(). Как показано выше, вы разбиваете данные на группы по SubCategoryId, затем ранжируете их и возвращаете первую, поэтому вы получаете только один результат. Вероятно, нужно что-то подправить в функции ROW_NUMBER(). - person How 'bout a Fresca; 13.05.2015

Вы можете использовать отдельные и не показывать столбцы из таблицы 2. Что-то типа:

select distinct t1.*
from table1 as t1
join table2 as t2
on t1.id = t2.id
where t1.id=1
person Ramon    schedule 13.05.2015