Sql 我想知道与输入值有关的具体数据

Sql 我想知道与输入值有关的具体数据,sql,sql-server,tsql,Sql,Sql Server,Tsql,下午好。在主题中,我需要一个查询来显示来自输入的数据,以查看它与2列相关的位置。例如,下表列出了旧的和新的机器ID。我想看看PBGM7D在变成PBGM7D之前与哪些ID相关 Old_MC_ID | New_MC_ID | __________|___________| PBG7A | PBBM7A TESTMC1 | TESTMC11 PPO230 | PPPO230 PBBM7A | PBG7A TESTMC11 | TESTMC11A TESTMC11A | TES

下午好。在主题中,我需要一个查询来显示来自输入的数据,以查看它与2列相关的位置。例如,下表列出了旧的和新的机器ID。我想看看PBGM7D在变成PBGM7D之前与哪些ID相关

Old_MC_ID | New_MC_ID |
__________|___________|
PBG7A     | PBBM7A
TESTMC1   | TESTMC11
PPO230    | PPPO230
PBBM7A    | PBG7A
TESTMC11  | TESTMC11A
TESTMC11A | TESTMC1A
PBG7A     | PBGM7A
OV11      | OV1
PBGM7A    | PBGM7D
查询结果是这样的

History_ID  |
____________|
PBGM7D
PBGM7A
PBG7A
PBBM7A
PBG7A

您可以使用递归CTE,如下所示:

CREATE TABLE T(
  OldId VARCHAR(10),
  NewId VARCHAR(10)
);

INSERT INTO T VALUES
('ID1', 'ID2'),
('ID10', 'ID11'),
('ID2', 'ID3'),
('ID3', 'ID4'),
('ID7', 'ID8');

WITH C AS
(
  SELECT OldId,
         NewId
  FROM T
  WHERE OldId = 'ID1'
  UNION ALL
  SELECT T.OldId,
         T.NewId
  FROM T JOIN C
  ON T.OldId = C.NewId
)
SELECT OldId History
FROM C
UNION
SELECT NewId
FROM C;
--OPTION (maxrecursion 0)
返回:

+---------+
| History |
+---------+
| ID1     |
| ID2     |
| ID3     |
| ID4     |
+---------+

到目前为止你都试过什么?如果您没有,我建议您查找rCTE(递归公共表表达式)。@Larnu现在,我尝试通过插入新列并为它们设置标识规范来标识每个MC/No。但非常感谢您对rCTE的建议。我想我现在有更多的选择。@puydan。id能否返回到已使用的id?也就是说,是否存在循环?@GordonLinoff,如果您的意思是在编辑或添加时将新id作为旧id返回。是的,他们是。非常感谢你的代码。但我遇到的问题是关于最大递归(我忘了告诉你,表中有可能存在重复数据的方法)你有什么解决方案可以在不进行任何错误处理的情况下保护最大递归吗?@puydan只需添加
选项(maxrecursion 0)