Sql server 基于非唯一列筛选表以在SQL中仅提供唯一字段
我如何筛选出一个表,它只包含一个列的一个值,不管是哪一个 用于创建以下内容的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
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。这非常有效。因为我需要进行联合,所以我所需要做的不是选择*而是选择我需要的字段。