SQL Server:通过排序匹配2个表中的记录
假设我有两个表,A和B,都有一个ID列和一个外键(值) 我想做一个基于选择的查询,只返回匹配的记录,不包括那些不符合相同数据条件的记录(SQL Server:通过排序匹配2个表中的记录,sql,sql-server,Sql,Sql Server,假设我有两个表,A和B,都有一个ID列和一个外键(值) 我想做一个基于选择的查询,只返回匹配的记录,不包括那些不符合相同数据条件的记录(ID和Value列),也按表B的Value列排序 表A SELECT * FROM (VALUES (15, 1), (16, 2), (17, 3) ) as t(idMetadata, [Value]) 表B SELECT * FROM (VALUES (185442, 22008, 16, 6 ,2), (187778, 22269, 16, 6 ,2)
ID
和Value
列),也按表B的Value
列排序
表A
SELECT *
FROM (VALUES
(15, 1),
(16, 2),
(17, 3)
) as t(idMetadata, [Value])
表B
SELECT *
FROM (VALUES
(185442, 22008, 16, 6 ,2),
(187778, 22269, 16, 6 ,2),
(211260, 24925, 16, 6 ,2),
(251476, 29431, 15, 4 ,1),
(251477, 29431, 16, 5 ,2),
(251478, 29431, 17, 6 ,3)
) as t(idDet, idEnc, idMetadata, OrderValue, [Value])
预期的结果是
这可以通过单个查询实现吗?还是必须创建CTE或子查询
编辑:对不起,我忘了提到查询的另一个条件:在表B中,记录应该具有相同的idEnc,OrderValue列应该是连续的,这就是为什么预期结果也具有相同的idEnc,OrderValue是4、5和6。我相信您可以通过相当简单的
内部联接来实现这一点:
SELECT
b.idDet, b.idEnc, b.IDMetadata, b.OrderValue, b.Value
FROM
TableB b
INNER JOIN
TableA a ON b.IDMetadata = a.idMetadata
AND b.Value = a.Value
我相信您可以通过一个相当简单的内部连接来实现这一点:
SELECT
b.idDet, b.idEnc, b.IDMetadata, b.OrderValue, b.Value
FROM
TableB b
INNER JOIN
TableA a ON b.IDMetadata = a.idMetadata
AND b.Value = a.Value
这将为您提供所需的结果:
SELECT idDet,
idEnc,
idMetadata,
OrderValue,
[Value]
FROM (
SELECT b.idDet,
b.idEnc,
b.idMetadata,
b.OrderValue,
b.[Value],
ROW_NUMBER() OVER (PARTITION BY b.idEnc ORDER BY b.OrderValue) as rn,
DENSE_RANK() OVER (ORDER BY a.[Value]) as dr
FROM TableB b
INNER JOIN TableA a
ON b.idMetadata = a.idMetadata AND b.[Value] = a.[Value]
) as t
WHERE rn = dr
这将为您提供所需的结果:
SELECT idDet,
idEnc,
idMetadata,
OrderValue,
[Value]
FROM (
SELECT b.idDet,
b.idEnc,
b.idMetadata,
b.OrderValue,
b.[Value],
ROW_NUMBER() OVER (PARTITION BY b.idEnc ORDER BY b.OrderValue) as rn,
DENSE_RANK() OVER (ORDER BY a.[Value]) as dr
FROM TableB b
INNER JOIN TableA a
ON b.idMetadata = a.idMetadata AND b.[Value] = a.[Value]
) as t
WHERE rn = dr
您可以使用CTE表示法
;with cte as(
SELECT B.*,row_number() over(partition by b.idmetadata order by b.value,b.iddet desc) rn
FROM (VALUES
(185442, 22008, 16, 6 ,2),
(187778, 22269, 16, 6 ,2),
(211260, 24925, 16, 6 ,2),
(251476, 29431, 15, 4 ,1),
(251477, 29431, 16, 5 ,2),
(251478, 29431, 17, 6 ,3)
) as B(idDet, idEnc, idMetadata, OrderValue, [Value])
inner join
(VALUES
(15, 1),
(16, 2),
(17, 3)
) as A(idMetadata, [Value]) on A.idMetadata=B.idMetadata
)
select * from cte
where rn=1
或无CTE:
select * from (
SELECT B.*,row_number() over(partition by b.idmetadata order by b.value,b.iddet desc) rn
FROM (VALUES
(185442, 22008, 16, 6 ,2),
(187778, 22269, 16, 6 ,2),
(211260, 24925, 16, 6 ,2),
(251476, 29431, 15, 4 ,1),
(251477, 29431, 16, 5 ,2),
(251478, 29431, 17, 6 ,3)
) as B(idDet, idEnc, idMetadata, OrderValue, [Value])
inner join
(VALUES
(15, 1),
(16, 2),
(17, 3)
) as A(idMetadata, [Value]) on A.idMetadata=B.idMetadata
) t
where rn=1
您可以使用CTE表示法
;with cte as(
SELECT B.*,row_number() over(partition by b.idmetadata order by b.value,b.iddet desc) rn
FROM (VALUES
(185442, 22008, 16, 6 ,2),
(187778, 22269, 16, 6 ,2),
(211260, 24925, 16, 6 ,2),
(251476, 29431, 15, 4 ,1),
(251477, 29431, 16, 5 ,2),
(251478, 29431, 17, 6 ,3)
) as B(idDet, idEnc, idMetadata, OrderValue, [Value])
inner join
(VALUES
(15, 1),
(16, 2),
(17, 3)
) as A(idMetadata, [Value]) on A.idMetadata=B.idMetadata
)
select * from cte
where rn=1
或无CTE:
select * from (
SELECT B.*,row_number() over(partition by b.idmetadata order by b.value,b.iddet desc) rn
FROM (VALUES
(185442, 22008, 16, 6 ,2),
(187778, 22269, 16, 6 ,2),
(211260, 24925, 16, 6 ,2),
(251476, 29431, 15, 4 ,1),
(251477, 29431, 16, 5 ,2),
(251478, 29431, 17, 6 ,3)
) as B(idDet, idEnc, idMetadata, OrderValue, [Value])
inner join
(VALUES
(15, 1),
(16, 2),
(17, 3)
) as A(idMetadata, [Value]) on A.idMetadata=B.idMetadata
) t
where rn=1
OrderValue的含义是什么?为什么5可以表示16-5-2(表B从底部开始的第二行),但6不应包括16-6-2(表B顶部的三行)。@kuri123orderValue是一个连续值,显示表B中idEnc记录的插入顺序。我编辑了这个问题,因为我忘了提到另一个条件,并且预期结果的行应该具有相同的idEnc,并且OrderValue应该是连续的,这就是为什么预期记录在OrderValue列中具有4、5和6,并且具有相同的idEnc。那么,您是否尝试了答案的解决方案?@gofr1 Yep,你和Alex Kudryashev的回答很有魅力!谢谢OrderValue的含义是什么?为什么5可以表示16-5-2(表B从底部开始的第二行),但6不应包括16-6-2(表B顶部的三行)。@kuri123orderValue是一个连续值,显示表B中idEnc记录的插入顺序。我编辑了这个问题,因为我忘了提到另一个条件,并且预期结果的行应该具有相同的idEnc,并且OrderValue应该是连续的,这就是为什么预期记录在OrderValue列中具有4、5和6,并且具有相同的idEnc。那么,您是否尝试了答案的解决方案?@gofr1 Yep,你和Alex Kudryashev的回答很有魅力!谢谢