2016-05-07 6 views
1

Angenommen, ich habe zwei Tabellen, A und B, beide mit einer ID-Spalte und einem Fremdschlüssel (Wert).SQL Server: übereinstimmende Datensätze aus 2 Tabellen mit Sortierung

Ich möchte eine ausgewählte Abfrage tun, die nur die passenden Datensätze zurückgibt, nicht solche, die den Zustand der mit den gleichen Daten nicht erfüllen (ID und Value Spalten), die ebenfalls von Value Spalte der Tabelle B. sortiert

Tabelle A

SELECT * 
FROM (VALUES 
(15, 1), 
(16, 2), 
(17, 3) 
) as t(idMetadata, [Value]) 

Tabelle 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]) 

Die ExPEC ted Ergebnis ist

enter image description here

dies durch eine einzige Abfrage erreicht werden kann? Oder muss ich ein CTE oder Unterabfragen erstellen?

EDIT: Sorry, ich habe vergessen, eine andere Bedingung für die Abfrage zu erwähnen: in Tabelle B sollten die Datensätze die gleiche IDEnc und die OrderValue -Spalte sollte aufeinander folgen, deshalb das erwartete Ergebnis haben auch die gleiche IDEnc und der OrderValue ist 4, 5 & 6.

+0

Welche Bedeutung von OrderValue ist? Warum 5 ist ok für 16 - 5 - 2 (Tabelle B zweite Reihe von unten), aber 6 sollte nicht enthalten 16 - 6 - 2 (Tabelle B oberen drei Reihen). – kurin123

+0

@ kurin123 OrderValue ist ein fortlaufender Wert, der die Reihenfolge angibt, in der die IDEnc-Datensätze in Tabelle B eingefügt wurden. Ich habe die Frage bearbeitet, weil ich vergessen habe, eine andere Bedingung zu erwähnen, und dass die Zeilen für das erwartete Ergebnis dieselbe IDEnc haben sollten und auch der OrderValue sollte fortlaufend sein. Deshalb haben die erwarteten Datensätze 4, 5 & 6 in der Spalte OrderValue IDEnc. – Adrian87

+0

Also, hast du Lösungen aus Antworten versucht? – gofr1

Antwort

1

Dass Sie gewünschte Ergebnis geben:

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

ich glaube, Sie mit diesem ein ziemlich einfacher machen kann 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

können Sie CTE Notation

;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 

oder ohne 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 
Verwandte Themen