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 来执行此操作。然后可以将其加入 Lines
和 Types
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
检查此代码-
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
我想知道如何获取两个辅助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 来执行此操作。然后可以将其加入 Lines
和 Types
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
检查此代码-
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