从一对多关系中的SQL查询中删除重复项

时间:2015-05-13 15:18:28

标签: sql-server sql-server-2008 tsql sql-server-2012 sql-server-2014

我有以下表关系:

表1 - >表2(DB中的一对多关系)

如果我在表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

这次我将获得多条记录,如果我在表2中多次插入表1中的ID。现在的问题是,在执行此查询中的连接之后是否有任何方式只显示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。我忘了提到这个查询的实际DB模式是:

产品 - > ProductsCategories< - Categories

因此,假设2个产品属于两个类别,我需要获得这两个产品,但没有重复。 Koppinjo的方式只返回1个结果......

2 个答案:

答案 0 :(得分: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

这样的事情会让你指向正确的方向。希望它有所帮助!

答案 1 :(得分:0)

您可以使用distinct,不要显示table2中的任何列。类似的东西:

Event
相关问题