每次在我们的系统中进行交易时,我们都会在表中写两行,以捕获Code的原始值和Code的新值,然后捕获两行的相同Transaction_ID。
表结构:
History_ID primary key
Transaction_ID int
Code varchar(3)
样本数据:
1 12345 ABC
2 12345 DEF
我需要一个查询,该查询将通过将具有相同Transaction_ID的2行连接起来而返回1行。结果集应在插入的第一行的“代码”列中标记为“旧代码”,然后在插入的第二行中将其标记为“新代码”。
示例输出:
Transaction Old Code New Code
12345 ABC DEF
我尝试使用子查询,但是我总是返回2行。我正在使用SQL Server。
答案 0 :(得分:1)
您可以在查询中多次对同一个表进行别名。在这种情况下,请通过Transaction_Id加入两个事务实例,并通过检索具有更大历史记录ID的行来使section实例为新的实例。
SELECT a.Transaction_ID, a.Code [OldCode], b.Code [NewCode]
FROM trx a
INNER JOIN trx b ON b.Transaction_ID = a.Transaction_ID
AND b.HistoryId > a.HistoryId
这假定每个事务ID只有两行。如果您有一系列交易事件,那么这将不起作用,并且您必须变得更加复杂。
答案 1 :(得分:1)
自行加入表格
SELECT h1.transaction_id, h1.code as 'New Code', h2.code as 'Old Code'
FROM history h1
JOIN history h2 ON h1.transaction_id = h2.transaction_id AND h1.history_id > h2.history_id