2016-05-07 2 views
1

Предположим, у меня есть две таблицы, A и B, как с столбцом идентификатора, так и с внешним ключом (значением).SQL Server: сопоставление записей из 2 таблиц с сортировкой

Я хочу сделать выбор на основе запроса, который возвращает только совпадающие записи, не включая тех, которые не удовлетворяют условие наличия один и тот же данные (ID и Value столбцов), также отсортированный по Value колонке таблицы B.

Таблица 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]) 

ожидат Ted результат

enter image description here

Может ли это быть достигнуто с помощью одного запроса? Или мне нужно создать CTE или подзапросы?

EDIT: Извините, я забыл упомянуть еще одно условие для запроса: в таблице B записи должны иметь один и тот же идентификатор, а столбец OrderValue должен быть последовательным. Вот почему ожидаемый результат также имеет тот же идентификатор, что и OrderValue 4, 5 & 6.

+0

Что такое смысл OrderValue? Почему 5 в порядке для 16 - 5 - 2 (таблица B второй строки снизу), но 6 не следует включать 16 - 6 - 2 (таблица B в верхние три строки). – kurin123

+0

@ kurin123 OrderValue - это последовательное значение, которое показывает порядок, в который были вставлены записи idEnc в таблице B. Я отредактировал вопрос, потому что забыл упомянуть еще одно условие и состоит в том, что строки ожидаемого результата должны иметь один и тот же idEnc, а также OrderValue должны быть последовательными, поэтому ожидаемые записи имеют 4, 5 и 6 в столбце OrderValue и то же самое idEnc. – Adrian87

+0

Итак, вы пробовали решения из ответов? – gofr1

ответ

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 
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

Вы можете использовать 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 

или без КТР:

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 
Смежные вопросы