SQL Server:通过排序匹配2个表中的记录

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)

假设我有两个表,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),
(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的回答很有魅力!谢谢