Sql 如何从表中的两个相关行生成结果集中的一行
每次在我们的系统中有一个事务时,我们在一个表中写入两行,该表捕获代码的原始值和代码的新值,然后两行都有相同的事务ID 表格结构:Sql 如何从表中的两个相关行生成结果集中的一行,sql,tsql,Sql,Tsql,每次在我们的系统中有一个事务时,我们在一个表中写入两行,该表捕获代码的原始值和代码的新值,然后两行都有相同的事务ID 表格结构: History_ID primary key Transaction_ID int Code varchar(3) 1 12345 ABC 2 12345 DEF Transaction Old Code New Code 12345 ABC DEF 样本数据: History_ID primary key Tran
History_ID primary key
Transaction_ID int
Code varchar(3)
1 12345 ABC
2 12345 DEF
Transaction Old Code New Code
12345 ABC DEF
样本数据:
History_ID primary key
Transaction_ID int
Code varchar(3)
1 12345 ABC
2 12345 DEF
Transaction Old Code New Code
12345 ABC DEF
我需要一个查询,该查询将通过连接具有相同事务ID的2行返回1行。结果集的第一行代码列应标记为“Old Code”,第二行代码列应标记为“New Code”
样本输出:
History_ID primary key
Transaction_ID int
Code varchar(3)
1 12345 ABC
2 12345 DEF
Transaction Old Code New Code
12345 ABC DEF
我尝试过使用子查询,但总是返回两行。我正在使用SQL Server。您可以在查询中多次为同一个表别名。在这种情况下,通过事务\ Id连接两个事务实例,并通过检索具有更大历史Id的行,使节实例成为较新的实例
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只有两行。如果您有一系列事务事件,那么这将不起作用,并且您必须更加复杂。您可以在查询中多次别名同一个表。在这种情况下,通过事务\ Id连接两个事务实例,并通过检索具有更大历史Id的行,使节实例成为较新的实例
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只有两行。如果您有一系列事务事件,那么这将不起作用,您必须变得更加复杂。将表本身连接起来
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
将表本身连接起来
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
下次代码更改时会发生什么,DEF->GHI?这是新事务(和事务_ID)还是相同?具有新事务ID的新事务。具有相同事务ID的最多和最少行数将为2。下次更改代码时会发生什么,DEF->GHI?这是一个新事务(和事务_ID)还是相同的?一个具有新事务ID的新事务。具有相同事务ID的最多和最少行数将为2。谢谢,我猜Daniel在您之前几秒钟按了发送按钮,但它们都是正确的答案。谢谢,我猜丹尼尔在你按下发送按钮前几秒钟按下了发送按钮,但他们都是正确的答案。