根据非唯一列过滤表以仅提供SQL中的唯一字段

时间:2019-01-17 06:36:04

标签: sql-server tsql

我该如何过滤出一个表,该表只包含一个列的值(无关紧要是哪个)。

用于创建以下内容的SQL查询如下所示:

    SELECT DISTINCT
        S.Id AS ReferenceID,
        M.NewModuleID AS ModuleId,
        SM.Compulsory           
    FROM
        Struct S
    INNER JOIN
        StructModule SM 
             ON SM.StructId = S.Id
    INNER JOIN
        ModuleMap M 
             ON M.StructId = S.Id 
             AND SM.ModuleId = M.OldModuleId

但是,这不会以我需要的方式返回值。返回表如下所示:

ReferenceID  NewModuleID  Compulsory
     1            100          1
     1            210          0
     2            251          1
     2            251          0

但是,我希望SQL查询返回NewModuleID字段的唯一值。理想情况下,首先出现一个值

上表的相关列如下:

Struct:
      ID          (INT)

StructModule:
      ID          (INT)
      StructID    (INT)
      ModuleID    (INT)
      Compulsory  (BIT)

 ModuleMap:
      ID          (INT)
      OldModuleId (INT)
      StructID    (INT)
      NewModuleID (INT)

1 个答案:

答案 0 :(得分:1)

您的问题不是很清楚,但是在阅读了以下声明之后。

  

但是我希望SQL查询返回唯一的值   NewModuleID字段。理想情况下采用值的首次出现

我可以猜到您正在寻找类似以下查询的内容。

   SELECT * FROM
   (
    SELECT 
        S.Id AS ReferenceID,
        M.NewModuleID AS ModuleId,
        SM.Compulsory     ,
        ROW_NUMBER() OVER(PARTITION BY S.ID, M.NewModuleID ORDER BY   M.NewModuleID) RN    
    FROM
        Struct S
    INNER JOIN
        StructModule SM 
             ON SM.StructId = S.Id
    INNER JOIN
        ModuleMap M 
             ON M.StructId = S.Id 
             AND SM.ModuleId = M.OldModuleId
    )T
    WHERE RN=1

注意:如果使用RN=1条件,则不需要区分。