SQL Server 2005查询

3

今天我实在是想不通这个问题了 - 所以非常感谢您的帮助。

表格结构

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

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

示例数据

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

预期结果

我需要能够将交易与付款匹配。基本上,我会得到:

TransactionId     PaymentId 

500500           0001 
500501           0002 
500502           0003

通过帐号,付款日期和金额进行匹配的交易。

这似乎非常简单,但我似乎无法解决它。

更新

为了澄清我的情况,我有一个历史交易列表,如上表所示。我有一个包含支付信息的文件,同样是历史性的。我需要将交易与文件中的支付匹配。

为什么?

  • 查找文件中不存在的任何交易
  • 查找文件中没有相应交易的任何付款
  • 创建一个“链接”表,其中包含TransactionID和PaymentID,以便将来查询此数据的任何其他人不会遇到同样的问题。

当出现帐户/金额/日期冲突时,就像这里一样,是什么决定了哪笔交易匹配哪笔付款?数据库ID? - Rup
1
@rup - 实际上,将哪个paymentid映射到哪个transactionid并不重要。只要它们只被映射一次且没有重复即可。 - codingbadger
2个回答

4

你无法解决问题的原因是Transaction和Payment之间没有任何关联。

为了使结果有意义,你需要在其中一个表中添加一个外键,引用另一个表中的相关信息。

我会修改这些表:

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
)

然后你可以进行简单的查询(如果想要更多内容,可以使用连接):

select TransactionId, PaymentId from #payments

2
我会把键放在另一个方向,这样支付就是交易的一种类型。 - Joel Coehoorn
@Joel - 这正是我想要做的,这样它就可以支持单个交易的多个付款。显然我的手没有按照我的头脑所想的去做。感谢你指出来! - Justin Niessner
我理解你的意思,我也想到了同样的目标。但是,我该如何实现呢?这些支付中的任何一个都可能与任何一个交易相关联。我需要能够创建一对一映射,以便我可以创建外键。哪个支付 ID 被映射并不重要,只要交易 ID 或支付 ID 只映射一次即可。 - codingbadger

3

为什么支付要单独成表呢?因为支付只是交易的一种类型。如果有额外的数据与支付相关,那也没关系。但是即使在这种情况下,你也不应该在支付表中重复基本交易信息。将其放入交易表中,并为支付表添加一个TransactionID列,以便将其与交易关联起来。


这里,这里。看起来你正在对结构进行反规范化,但实际上并非如此。归一化尚未发挥作用。 - Keng
我需要将账户上的交易与实际付款匹配。因此需要不同的表格。虽然我不愿意,但我必须这么做!我想尝试添加一些外键约束来将交易链接到付款。我所能想到的唯一另一种方法是逐行匹配它们,但这听起来对我来说是一个巨大的 hack。 - codingbadger
1
@Barry - 你没有听懂我的意思。当你收到一笔付款时,你需要创建一个交易记录来保存账户号码、金额和日期等信息。同时,你还需要为实际的付款创建付款记录,但该表本身并不包含任何这些信息。相反,它会得到一个TransactionID来查找这些数据。它可能还有其他数据,比如支票号码,但在任何情况下都不应该重复交易记录。 - Joel Coehoorn
如果这只是一个填充外键的一次性匹配,那么你最好逐行进行操作,无论是否需要hack,假设你的数据集不是庞大的 - 在一次性任务中,运行时间/清洁度/效率与开发时间之间的权衡是不同的。 - Rup

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接