假设我有两个表,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。
答案 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