2017-07-11 1 views
0

J'ai deux tables: données de base et exemples de données.Correspondance SQL entre deux tables et correspondance supplémentaire entre les colonnes

Master Data a des colonnes "clés", "de la date", "à ce jour", "Paytm"

données de l'échantillon comporte des colonnes "clés", "date de création", "PayTS"

I essaie d'obtenir le code pour ce faire:

  1. pour chaque match « clé » entre deux tables>

  2. Déterminer si « date de création » se situe entre « la date » et « à ce jour » >SI OUI, montrez ce match/enregistrement (à partir du tableau de données type), y compris PayTM et PayTS. SI NON, ne montrez pas l'enregistrement. (Et passer par tous les matchs effectuant les étapes 2 et 3)

C'est ce que j'ai jusqu'à présent, mais il est montrant les enregistrements qui ne correspondent pas ... J'ai essayé de remplacer OU PAS EXISTE par exists mais ça me donne une erreur. Mes compétences de codage sql sont très basiques et j'ai du mal à essayer de faire passer le code après cela pour une raison quelconque.

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

Lire sur les jointures – Strawberry

Répondre

1

Votre problème peut être résolu par une simple jointure. Quelque chose comme:

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

Remarque: La requête ci-dessus est une pseudo-requête juste à une idée haute lumière.

+0

Quand j'ai essayé d'appliquer cette solution, il tire dans tous les enregistrements de données pour ce match entre « Key » et les dates. J'en ai seulement besoin pour extraire les enregistrements correspondants à partir des données de l'échantillon, mais également pour inclure «PayTM» à partir des données de base uniquement. Est-ce que je fais cela en disant SELECT cd. *, Md. [PayTM]? – KateLO

+0

Aussi, si je voulais ajouter une colonne avec cette requête qui regarderait "PayTS" et "PayTM", et si ces deux correspondaient, il dirait "oui" et s'ils ne correspondaient pas, il dirait "Non". ... est-ce possible de faire ça avec sql? – KateLO

+0

@KateLO Vous pouvez simplement utiliser 'md.PayTM' est la partie de sélection au lieu de' md. * '. Si vous pouvez partager la requête exacte, je peux la modifier. Je ne pense pas que la requête affichée dans OP soit écrite car elle fait référence à [Date de création] 'dans md, ce qui n'est pas correct. – MKR

0

Je pense que cela devrait gérer cela.

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'