Sql 如何从表中的两个相关行生成结果集中的一行

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

每次在我们的系统中有一个事务时,我们在一个表中写入两行,该表捕获代码的原始值和代码的新值,然后两行都有相同的事务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
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在您之前几秒钟按了发送按钮,但它们都是正确的答案。谢谢,我猜丹尼尔在你按下发送按钮前几秒钟按下了发送按钮,但他们都是正确的答案。