0

У меня есть отношения таблицы следующим образом:Удаление дубликатов из 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 

На этот раз я получу несколько записей, если у меня есть ID из таблицы 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 

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

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

Продукция -> ProductsCategories < - Категории

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

+0

Вы получаете несколько записей, так как есть несколько записей, которые соответствуют вашему критерию. Как sql serevr знает, какие значения получить из таблицы2? вам необходимо предоставить условие для фильтрации строк в таблице2, имеющего тот же идентификатор, что и t1.id. –

+0

Как сказал Зохар Пелед, вам нужно рассказать, какие строки в таблице 2 вы хотите увидеть. Например, вы хотите увидеть первую строку в таблице 2? Или самое большое значение? Вам необходимо предоставить условие для фильтрации строк или сделать группу или что-то вроде этого. –

ответ

1

Я бы предложил использовать функцию окна, такую ​​как 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 

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

+0

Можете ли вы просмотреть мой обновленный вопрос. Я использовал свой путь, но не работал на 100%, и я не уверен, почему ... – perkes456

+0

Попробуйте изменить столбец ORDER BY (в части запроса PARTITION BY) на что-то другое, кроме ПК. [SubCategoryID]. Обычно вы хотите заказать что-то вроде созданной даты или orderId - что-то, что имеет естественную мощность. –

+0

Я изменил его, но все же возвращает только 1 результат ... Проблема в том, что, если два разных продукта находятся под одной и той же подкатегорией? Этот запрос возвращает только один продукт за раз, но как отображать их оба (если есть два продукта под одной категорией). Это много для многих отношений ... – perkes456

0

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

select distinct t1.* 
from table1 as t1 
join table2 as t2 
on t1.id = t2.id 
where t1.id=1 
Смежные вопросы