2017-12-20 1 views
0

Diese Art von Problem hat mich verblüfft.SQL: Wie man einen linken Join macht und jeden linken Wert nur einmal abgleicht

Ich habe 2 Tabellen mit Geldwerten, und ich muss übereinstimmende Werte von einer anderen Tabelle finden. Wenn die erste Tabelle dreimal einen Wert (z. B. 10) und die zweite Tabelle zweimal aufweist, muss das gewünschte Ergebnis zwei übereinstimmende Werte anzeigen, und eins ist nicht übereinstimmend. Es ist ein Art Viele-zu-Viele-Problem.

Ich habe das Problem in einem Google-Doc https://docs.google.com/document/d/198ZiSGhR6wC2FWNc5Bcr5DTDjx3jCycFq9qlj-eQsEo/edit?usp=sharing

skizzierte

und implementiert sie in SQL Fiddle einschließlich mit verschiedenen Fehlversuchen. http://sqlfiddle.com/#!17/80353/1

Ich bevorzuge Postgres, aber eine generische SQL-Lösung wäre in Ordnung. Kann jemand helfen?

+2

einige copy'n'paste Sie, Mustertabellendaten und das erwartete Ergebnis auch hier hinzufügen. – jarlh

+0

Bitte ** [EDIT] ** Ihre Frage und fügen Sie Ihre [Beispieldaten] (http://plaintetxtols.github.io/plain-text-table/) und die erwartete Ausgabe basierend auf diesen Daten als [formatierter Text] (http://stackoverflow.com/help/formatting) (zB SQLFiddle ist ziemlich unzuverlässig für mich) –

Antwort

1

Verwendung Fensterfunktion row_number und voll beitreten

select a.id_a, coalesce(a.value, b.value), b.id_b 
from 
(
    select *, row_number() over (partition by value order by id_b) rn 
    from b 
) b 
full join 
(
    select *, row_number() over (partition by value order by id_a) rn 
    from a 
) a on b.value = a.value and 
     b.rn = a.rn 

sqlfiddle demo

Verwandte Themen