Sql server 基于非唯一列筛选表以在SQL中仅提供唯一字段

Sql server 基于非唯一列筛选表以在SQL中仅提供唯一字段,sql-server,tsql,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

我如何筛选出一个表,它只包含一个列的一个值,不管是哪一个

用于创建以下内容的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)

你的问题不是很清楚,但在读了下面的陈述之后

但是,我希望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条件,则不需要使用distinct。

这非常有效。因为我需要进行联合,所以我所需要做的不是选择*而是选择我需要的字段。