SQL JOIN table 具有最大值的增量变量的数据

SQL JOIN table data with incremental variable with max value

我想知道如何获取两个辅助table的连接查询以获得完整的生产线测试槽"names"或"tags"

第一个辅助table有某台机器有多少插槽的信息。看起来像

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

第二个包含每条生产线的机器 ID 列表。看起来像:

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

我不知道如何使用 MachineID 列表和每台机器拥有的槽数来构建 "MachineID+SlotNum" 标签列表

按行过滤时的预期结果如下:

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

谢谢!

要生成这个结果,你需要组成一个数字table,它由1到MAX(SlotNumber)之间的数字组成。在此查询中,我使用递归 CTE 来执行此操作。然后可以将其加入 LinesTypes table 以形成列表:

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

Demo on dbfiddle

检查此代码-

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