2017-09-20 3 views
0

Ich habe zwei Tabellen mit Datensätzen, die Datumsintervalle angeben. Die Tabellen haben zwei Felder gemeinsam. Die Intervallfelder werden als zwei Felder (von/bis) ausgedrückt, die in beiden Tabellen verwendet werden. Ich möchte sie verbinden, basierend auf den gemeinsamen Feldern und überlappende Intervalle:Verknüpfen Sie Tabellen basierend auf überlappenden Zeitintervallen

Joining two tables with diff intervals

Wie kann ich das tun? Ich möchte alle Datensätze aus Tabelle 1, und wenn es eine Überschneidung mit dem Intervall in Tabelle 2 gibt, möchte ich das im Ergebnis hinzugefügt.

+1

Welches [DBMS] (https://en.wikipedia.org/wiki/DBMS) Produkt verwenden Sie? Postgres? Orakel? "_SQL_" ist nur eine Abfragesprache, nicht der Name eines bestimmten Datenbankprodukts. –

+0

Bitte lesen Sie http://meta.stackoverflow.com/questions/285551/why-may-i-not-upload-images-of-code-on-so-when-asking-a-question/285557 und die angenommene Antwort –

+0

Ihr Titel besagt ** überlappende Zeitintervalle **; Ihre Beschreibung besagt ** überlappende Datumsintervalle ** und Ihre Datenbankstruktur impliziert ** überlappende Tiefenintervalle **. Vielleicht müssen Sie das auch klären? –

Antwort

0

Sie eine äußere können mit einem Join-Bedingung, das Datum zum Ausdruck bringt überlappt:

select t1.*, 
      t2.depth_from as from2, t2.depth_to as to2, t2.code as code2 
from  table1 t1 
left join table2 t2 
     on t1.DataSet = t2.DataSet 
     and t1.HoleID = t2.HoleID 
     and t1.Depth_From < t2.Depth_To 
     and t1.Depth_To > t2.Depth_From 
0

Verknüpfen Sie die Tabellen auf den beiden gemeinsamen Felder, und dann die Ergebnisse nur dann, wenn die Datensätze begrenzen eine vollständige oder teilweise ist Überlappung von Tiefenbereichen. Sie haben nicht angegeben, welche Sie verwenden, daher müssen Sie möglicherweise entsprechend ändern.

SELECT 
     t1.* 
    , t2.Depth_From AS DFrom 
    , t2.Depth_To AS DTo 
    , t2.Code AS Code 
FROM 
    table1 AS t1 
    LEFT JOIN table2 AS t2 
     ON t1.DataSet = t2.DataSet 
      AND t1.HoleID = t2.HoleID 
WHERE 
     (t1.Depth_From <= t2.Depth_From AND t1.Depth_To >= t2.Depth_To) 
    OR (t1.Depth_From >= t2.Depth_From AND t1.Depth_To <= t2.Depth_To) 
    OR (t1.Depth_From < t2.Depth_From AND t1.Depth_To > t2.Depth_From) 
    OR (t1.Depth_From < t2.Depth_To AND t1.Depth_To > t2.Depth_To); 
Verwandte Themen