Как найти строки в ms-sql со значением других строк следующим образом? - PullRequest
0 голосов
/ 05 февраля 2019

Я создал таблицу Sql для отслеживания истории операций объектов.У меня есть две колонки;Первый - это код самопроверки, а второй - код трассировки для кода, поступающего от исходного объекта к цели.Я создал это, чтобы иметь возможность искать маршрут операций через объекты.Вы можете увидеть пример таблицы трассировки ниже:

image

Мне нужно создать SQL-код для запроса, чтобы показать все маршруты в одной таблице.Когда я вначале выберу самокод, это будет входящий код для предыдущих строк.Может быть больше одного входящего кода для себя, и я хочу иметь возможность отслеживать все.И я хочу дойти до конца, пока мой поиск не станет пустым.

Я пытался выбрать запрос, как показано ниже, но я такой новый 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')));

1 Ответ

0 голосов
/ 06 февраля 2019

Для выполнения такого рода родительских / дочерних действий на любом уровне без явного кодирования всех уровней вам необходимо использовать рекурсивный CTE.

Подробнее здесь

https://www.red -gate.com / simple-talk / sql / t-sql-программирования / 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;

Также обратите внимание, чтоБольшую часть времени для генерации этого ответа было потрачено на создание образца данных для использования.

В будущем, когда задают вопросы, люди с гораздо большей вероятностью помогут, если вы опубликуете этот пример создания данных самостоятельно

...