如何在 ms-sql 中查找随后具有另一行值的行?

How to find rows in ms-sql with another rows' value followingly?

我创建了一个 Sql table 来跟踪对象的操作历史。我有两列;第一个是自跟踪代码,第二个跟踪代码是从源对象到目标的代码的跟踪代码。我创建它是为了能够通过对象查找操作路线。您可以在下面查看跟踪示例 table:

我需要创建一个 sql 代码来查询以在一个 table 中显示所有路线。当我首先 select 自身代码时,它将是前几行的传入代码。 self 可能有不止一个传入代码,我希望能够跟踪所有代码。我想结束直到我的搜索为空。

我试过 select 如下查询,但我很新 sql 需要你的帮助。

SELECT [TracingCode.Self],
       [TracingCode.Incoming],
       [EquipmentNo]
FROM [MKP_PROCESS_PRODUCT_REPORTS].[dbo].[ProductionTracing.Main]
WHERE [TracingCode.Self] = (SELECT [TracingCode.Incoming]
                            FROM [MKP_PROCESS_PRODUCT_REPORTS].[dbo].[ProductionTracing.Main]
                            WHERE [TracingCode.Self] = (SELECT [TracingCode.Incoming]
                                                        FROM [MKP_PROCESS_PRODUCT_REPORTS].[dbo].[ProductionTracing.Main]
                                                        WHERE [TracingCode.Self] = (SELECT [TracingCode.Incoming]
                                                                                    FROM [MKP_PROCESS_PRODUCT_REPORTS].[dbo].[ProductionTracing.Main]
                                                                                    WHERE [TracingCode.Self] = '028.001.19.2.3')));

要在任何级别上执行这种 parent/child 事情而无需明确编码所有级别,您需要使用 递归 CTE。

此处有更多详细信息

https://www.red-gate.com/simple-talk/sql/t-sql-programming/sql-server-cte-basics/

这是一些测试数据和我想出的解决方案。请注意 三个 记录实际上匹配 028.001.19.2.3

如果这不能满足您的需要,请使用示例数据进一步解释。

DECLARE @Sample TABLE  (
TC_Self CHAR(14) NOT NULL, 
TC_In CHAR(14) NOT NULL, 
EquipmentNo INT NOT NULL
);

INSERT INTO @Sample (TC_Self, TC_In, EquipmentNo)
VALUES 
('028.001.19.2.3','026.003.19.2.2',96),
('028.001.19.2.3','026.001.19.2.2',96),
('028.001.19.2.3','026.002.19.2.2',96),
('028.001.19.2.2','026.002.19.2.1',96),
('028.001.19.2.2','026.002.19.2.1',96),
('028.001.19.2.1','026.002.19.1.1',96),
('026.003.19.2.2','024.501.19.2.5',117),
('024.501.19.2.5','024.501.19.2.6',999),
('024.501.19.2.6','024.501.19.2.7',998);


WITH CTE (RecordType, TC_Self, TC_In, EquipmentNo)
AS
(
-- This is the 'root'
SELECT 'Root' RecordType, TC_Self, TC_In, EquipmentNo FROM @Sample
WHERE TC_Self = '028.001.19.2.3'
UNION ALL

SELECT 'Leaf' RecordType, S.TC_Self, S.TC_In, S.EquipmentNo FROM @Sample S
INNER JOIN CTE 
ON S.TC_Self = CTE.TC_In 
)

SELECT * FROM CTE;

另请注意,生成此答案的大部分时间都用于生成要使用的样本数据。

将来提问时,如果您自己post生成此示例数据

,人们更有可能提供帮助