Данные таблицы SQL JOIN с инкрементной переменной с максимальным значением - PullRequest
2 голосов
/ 24 сентября 2019

Мне интересно, как получить запрос на объединение двух вспомогательных таблиц, чтобы получить полный набор слотов для тестирования производственных линий "имена" или "теги"

В первой вспомогательной таблице содержится информация о том, сколькослоты, которые есть у определенной машины.И это выглядит как

Machine Types AUX table
------------------------------------------------------
MachineTypeID   SlotNumber
1               5
2               3
3               10

На втором есть список идентификаторов машин для каждой производственной линии.Похоже:

Lines AUX table
----------------------------------
LineID   MachineID   MachineTypeID
1        PR00231     1
1        PR00049     2
2        PR00147     1
2        PR00017     2
2        PR00178     3

Я не знаю , как построить список тегов "MachineID + SlotNum" , используя список идентификаторов MachineID и количество слотов, которые есть на каждой машине.

Ожидаемый результат при фильтрации по строке будет выглядеть следующим образом:

LINE 2 list of slotsTAGs:
-----------------------------------
PR00147_Slot1
PR00147_Slot2
PR00147_Slot3
PR00147_Slot4
PR00147_Slot5
PR00017_Slot1
PR00017_Slot2
PR00017_Slot3
PR00178_Slot1
PR00178_Slot2
PR00178_Slot3
PR00178_Slot4
PR00178_Slot5
PR00178_Slot6
PR00178_Slot7
PR00178_Slot8
PR00178_Slot9
PR00178_Slot10

Спасибо!

Ответы [ 2 ]

0 голосов
/ 24 сентября 2019

Проверьте этот код-

IF OBJECT_ID('[Machine Types AUX]') IS NOT NULL
    DROP TABLE [Machine Types AUX]

CREATE TABLE [Machine Types AUX]
(
MachineTypeID INT NOT NULL IDENTITY(1,1) CONSTRAINT [PK_MachineTypesAUX] PRIMARY KEY CLUSTERED,
SlotNumber INT NOT NULL
)
GO

INSERT INTO [Machine Types AUX] (SlotNumber)
VALUES (5),(3),(10)

IF OBJECT_ID('[Lines AUX]') IS NOT NULL
    DROP TABLE [Lines AUX]

CREATE TABLE [Lines AUX]
(
LineID INT NOT NULL,
MachineID VARCHAR(10) NOT NULL,
MachineTypeID INT NOT NULL
)
GO

INSERT INTO [Lines AUX] (LineID,MachineID,MachineTypeID)
VALUES (1,'PR00231',1),
(1,'PR00049',2),
(2,'PR00147',1),
(2,'PR00017',2),
(2,'PR00178',3)

--SELECT * FROM [Machine Types AUX]
--SELECT * FROM [Lines AUX]

--EXPECTED_RESULT:
SELECT CONCAT(MachineID,'_Slot',SlotNumber) AS slotsTAGs 
FROM [Machine Types AUX] T INNER JOIN [Lines AUX] T1 ON T.MachineTypeID=T1.MachineTypeID
0 голосов
/ 24 сентября 2019

Чтобы получить этот результат, вам нужно сформировать таблицу чисел, которая состоит из чисел от 1 до MAX(SlotNumber).В этом запросе я использовал рекурсивный CTE для этого.Затем его можно присоединить к таблице Lines и Types для формирования списка:

WITH cte1 AS (
SELECT  MAX(SlotNumber) AS MaxSlot FROM Types
), cte2 (Slot) AS 
(SELECT 1 AS Slot
 UNION ALL
 SELECT Slot+1 FROM cte2 WHERE Slot < (SELECT MaxSlot FROM cte1))
SELECT CONCAT(l.MachineID, '_Slot', c.Slot) AS Slots
FROM Lines l
JOIN Types t ON t.MachineTypeID = L.MachineTypeID
JOIN cte2 c ON c.Slot <= t.SlotNumber
WHERE l.LineID = 2
ORDER BY l.MachineId, c.Slot

Вывод:

Slots
PR00017_Slot1
PR00017_Slot2
PR00017_Slot3
PR00147_Slot1
PR00147_Slot2
PR00147_Slot3
PR00147_Slot4
PR00147_Slot5
PR00178_Slot1
PR00178_Slot2
PR00178_Slot3
PR00178_Slot4
PR00178_Slot5
PR00178_Slot6
PR00178_Slot7
PR00178_Slot8
PR00178_Slot9
PR00178_Slot10

Демонстрация на dbfiddle

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...