如何在 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生成此示例数据
,人们更有可能提供帮助
我创建了一个 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生成此示例数据
,人们更有可能提供帮助