2010-11-02 7 views
3

Je n'arrive pas à comprendre ce que je fais aujourd'hui - donc votre aide est très appréciée.Requête SQL Server 2005

Tableau Structure

Create Table #trans 
(
TransactionId int, 
AccountNumber varchar(10), 
TransactionAmount money, 
TransactionDate DateTime 
) 

Create Table #payments 
(
PaymentId int, 
AccountNumber varchar(10), 
PaymentAmount money, 
PaymentDate 
) 

Exemple de données

Insert Into #trans 
Values (500500 ,'10000001', 10000.00, '2008-10-02') 
GO 
Insert Into #trans 
Values (500501 ,'10000001', 10000.00, '2008-10-02') 
GO 
Insert Into #trans 
Values (500502 ,'10000001', 10000.00, '2008-10-02') 
GO 

Insert Into #payments 
Values (0001,'10000001', 10000.00, '2008-10-02') 
GO 
Insert Into #payments 
Values (0002,'10000001', 10000.00, '2008-10-02') 
GO 
Insert Into #payments 
Values (0003,'10000001', 10000.00, '2008-10-02') 
GO 

Résultats attendus

Je dois pouvoir faire correspondre les transactions avec les paiements. Donc, fondamentalement, je vais obtenir:

TransactionId  PaymentId 

500500   0001 
500501   0002 
500502   0003 

La transaction étant appariée sur le numéro de compte, la date de paiement et le montant.

Cela semble vraiment simple, mais je ne peux pas sembler travailler.

Mise à jour

Pour essayer de clarifier ma situation, j'ai une liste des transactions historiques selon le tableau ci-dessus. J'ai un fichier contenant des paiements, encore une fois historique. Je dois faire correspondre les transactions aux paiements dans le fichier.

Pourquoi?

  • pour trouver les transactions qui n'existent pas dans le fichier.
  • pour créer un "lien" table qui contiendra le TransactionID et PaymentID de sorte qu'à l'avenir toute autre personne interrogeant ces données n'aura pas le même problème.
+0

Lorsqu'il y a un conflit de compte/quantité/date, comme c'est le cas ici, qu'est-ce qui détermine quelle transaction correspond à quel paiement? ID de base de données? – Rup

+1

@rup - cela n'a pas vraiment d'importance quel paymentid est mappé à quel transactionid. Juste tant qu'ils ne sont cartographiés qu'une seule fois et qu'il n'y a pas de doublons. – codingbadger

Répondre

4

La raison pour laquelle vous ne pouvez pas résoudre ce problème est qu'il n'y a rien qui relie une transaction à un paiement.

Vous devez ajouter une clé étrangère à l'une des tables référençant l'élément d'information associé dans l'autre table pour que le résultat ait une signification quelconque.

Je modifierais les tables comme:

Create Table #payments 
(
    PaymentId int, 
    AccountNumber varchar(10), 
    PaymentAmount money, 
    PaymentDate, 
    TransactionId int, 
    foreign key (TransactionId) references #trans(TransactionId) 
) 

Create Table #trans 
(
    TransactionId int, 
    AccountNumber varchar(10), 
    TransactionAmount money, 
    TransactionDate DateTime 
) 

Et vous pouvez alors faire une requête simple (ou une jointure si vous voulez plus que les ids):

select TransactionId, PaymentId from #payments 
+2

Je mettrais la clé dans l'autre sens, de sorte qu'un paiement est un type de transaction. –

+0

@Joel - C'est ce que je voulais faire pour supporter plusieurs paiements dans le cadre d'une transaction unique. Apparemment, mes mains n'ont pas fait ce que pensait ma tête. Merci de l'avoir signalé! –

+0

Je peux voir d'où vous venez et c'est là que je veux aller. Cependant, comment vais-je faire cela? Chacun de ces paiements pourrait être lié à l'une des transactions. Je dois être en mesure de créer un mappage un à un afin que je puisse créer le FK. Peu importe quel identifiant de paiement est mappé tant qu'un ID de transaction ou un identifiant de paiement n'est mappé qu'une seule fois. – codingbadger

3

Pourquoi le paiement une table séparée? Un paiement est juste un type de transaction. S'il y a des données supplémentaires qui vont avec un paiement, c'est bien. Mais même dans ce cas, vous ne devez pas dupliquer les informations de transaction de base dans la table de paiement. Placez-le dans la table des transactions et donnez à la table de paiement une colonne TransactionID que vous utiliserez pour la relier à la transaction.

+0

Ici, ici. Il peut sembler que vous dénormalisiez la structure, mais en réalité vous ne l'êtes pas. La normalisation n'est pas encore entrée en jeu. – Keng

+0

Je dois faire correspondre la transaction sur un compte au paiement physique. D'où les différentes tables. J'aimerais ne pas mais je le fais! Je veux essayer d'ajouter des contraintes FK pour lier la transaction à un paiement. La seule autre façon que je peux penser - est de les faire correspondre ligne par ligne, mais cela ressemble à un hack massif pour moi. – codingbadger

+1

@Barry - vous ne m'entendez pas. Lorsque vous recevez un paiement, vous créez une transaction pour ce paiement qui contient le numéro de compte, le montant et la date. Vous créez également votre enregistrement de paiement pour le paiement physique, mais cette table contient ** aucun ** de ces choses par lui-même. Au lieu de cela, il obtient un TransactionID pour savoir où chercher ces données. Il pourrait également avoir des données supplémentaires comme un numéro de chèque, mais en aucun cas vous ne devriez dupliquer la transaction. –