【问题标题】:SQL JOIN table data with incremental variable with max value具有最大值的增量变量的 SQL JOIN 表数据
【发布时间】:2019-09-24 13:13:17
【问题描述】:

我想知道如何获取两个辅助表的连接查询以获得完整的产线测试槽“名称”或“标签”

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

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

谢谢!

【问题讨论】:

    标签: sql tsql sql-server-2008


    【解决方案1】:

    要生成此结果,您需要形成一个数字表,其中包含从 1 到 MAX(SlotNumber) 的数字。在这个查询中,我使用了递归 CTE 来做到这一点。然后可以将其加入LinesTypes 表以形成列表:

    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

    【讨论】:

    • 嗨,尼克,您的解决方案运行良好,谢谢!事实上,我已将您的嵌套 cte 添加到我的 cte 链中,最后我在某一行的所有插槽中获得了良好的性能结果,即使是未报告任何活动的禁用插槽。
    【解决方案2】:

    检查此代码-

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-22
      • 2018-10-05
      • 1970-01-01
      • 2011-03-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多