SQL Server:匹配2个表中的记录并进行排序

时间:2016-05-07 20:43:03

标签: sql sql-server

假设我有两个表,A和B,都有一个ID列和一个外键(值)。

我想做一个基于选择的查询,它只返回匹配的记录,不包括那些不符合具有相同数据(IDValue列)条件的记录,也是排序的在表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])

预期结果是

enter image description here

这可以通过单个查询实现吗?或者我是否必须创建CTE或子查询?

编辑:对不起,我忘了提到查询的另一个条件:在表B中,记录应该具有相同的idEnc,OrderValue列应该是连续的,这就是为什么预期的结果也具有相同的idEnc而OrderValue是4 ,5& 6。

3 个答案:

答案 0 :(得分:2)

您可以使用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

答案 1 :(得分:1)

我相信你可以用一个相当简单的INNER JOIN

来做到这一点
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

答案 2 :(得分:1)

这会给你想要的结果:

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