2017-07-11 6 views
0

Ich habe zwei Tabellen: Stammdaten und Beispieldaten.SQL-Übereinstimmung zwischen zwei Tabellen und weitere Übereinstimmung zwischen den Spalten

Stammdaten haben Spalten "Schlüssel", "ab dem Datum", "to date", "PayTM"

Beispieldaten haben Spalten "Schlüssel", "Erstellungsdatum", "PayTS"

I ist versucht, den Code zu bekommen, dies zu tun:

  1. Für jede "Schlüssel" Übereinstimmung zwischen zwei Tabellen>

  2. fest, ob "Erstellungsdatum" fällt zwischen "ab Datum" und "to date" >

  3. Wenn JA, zeigen Sie das Match/Record (aus der Tabelle Sample Data) einschließlich PayTM und PayTS. WENN NEIN, den Datensatz nicht anzeigen. (Und gehen durch alle Spiele Schritte 2 und 3 durchführen)

Das ist, was ich habe, so weit, aber es ist Aufzeichnungen zeigen, die nicht übereinstimmen ... ich ersetzen versucht WHERE NOT aber mit VORHANDEN EXISTS Es gibt mir einen Fehler. Meine SQL-Coding-Fähigkeiten sind sehr einfach und ich kämpfe mit dem Versuch, den Code aus irgendeinem Grund daran vorbei zu arbeiten.

SELECT cd.* 
FROM [Sample Data] as cd 
WHERE NOT EXISTS (SELECT 1 
       FROM [Master Data] as md 
       WHERE cd.Key = md.Key AND 
        md.[Creation Date] BETWEEN md.From Date and md.To Date 
      ); 
+0

Lesen Sie mehr über – Strawberry

Antwort

1

Ihr Problem kann durch einfaches Join gelöst werden. Etwas wie:

SELECT cd.* , md.* 
FROM [Sample Data] as cd, [Master Data] as md 
WHERE cd.Key = md.Key AND 
        cd.[Creation Date] BETWEEN md.[From Date] and md.[To Date]; 

Hinweis: Die obige Abfrage ist Pseudo-Abfrage nur zur High-Light-Idee.

+0

verbindet Als ich versuchte, diese Lösung anzuwenden, zieht es in allen Datensätzen für die Übereinstimmung zwischen „Key“ und die Termine. Ich benötige es nur, um diese übereinstimmenden Datensätze aus den Beispieldaten zu ziehen, aber auch "PayTM" nur aus den Stammdaten. Tun Sie dies, indem Sie SELECT cd. *, Md. [PayTM] sagen? – KateLO

+0

Auch, wenn ich eine Spalte mit dieser Abfrage hinzufügen wollte, die "PayTS" und "PayTM" betrachten würde, und wenn diese beiden übereinstimmten, würde es "ja" sagen und wenn sie nicht übereinstimmten, würde es "Nein" sagen. ... ist es möglich, das mit SQL zu tun? – KateLO

+0

@KateLO Sie können einfach 'md.PayTM' verwenden, wählen Sie einen Teil anstelle von' md. * '. Wenn Sie die genaue Abfrage teilen können, kann ich sie ändern. Ich denke nicht, dass Abfrage, die in OP gezeigt wird, schreibt, weil es '[Erstellungsdatum]' in md verweist, das nicht korrekt ist. – MKR

0

Ich denke, das sollte damit umgehen.

select 
     x.key_ 
     ,x.paytm 
     ,x.payts 
from(
    select 
      md.key as key_ 
      ,cd.paytm as paytm 
      ,cd.payts as payts 
      ,case when md.creation_date between md.from_date and md.to_date 
       then 'goodie' 
       else 'baddie' 
      end as the_test 

    from 
      [master data] md 
    inner join 
      [sample data] cd 
      on cd.key = md.key 
)x 
where 
     x.the_test != 'baddie' 
Verwandte Themen