SQL Server自动增量/数学问题特殊

时间:2015-04-16 08:07:48

标签: sql sql-server sql-server-2012

以下是我正在使用的5个表的entityRelationship图:

enter image description here

以下是我想要实现的一些示例数据:

tblController           
ControllerID    ControllerName      
     1           Controller 1       
     2           Controller 2       

tblControllerLine           
ControllerLineID    ControllerID        
       1                 1                  

tblDevice           
DeviceID    DeviceName      
   1         Device 1       
   2         Device 2       

tblDeviceLine           
DeviceLineID    DeviceID    ControllerLineID    Address
     1             1               1             1101
     2             2               1             1201


tblPointLine            
PointLineID DeviceLineID    InputType   Address
     1           1           Output      1101
     2           1           Output      1102
     3           1           Output      1103
     4           1           Output      1104
     5           1           Output      1105
     6           1           Output      1106
     7           1           Output      1107
     8           1           Output      1108
     9           2           Output      1201
     10          2           Output      1202
     11          2           Output      1203
     12          2           Output      1204
     13          2           Input       1201
     14          2           Input       1202
     15          2           Input       1203
     16          2           Input       1204

这是如何运作的:

  1. 用户选择一个Controller并将其添加到ControllerLine
  2. 用户选择要添加到ControllerLine上的Controller的设备。然后将其添加到DeviceLine并分配地址
  3. 用户向设备添加一个Point,该Point根据所选设备进行寻址。这将添加到PointLine表中。
  4. 现在我的问题是解决设备2所需的自动增量或数学计算。此SQL语句将解决设备1的tblDeviceLine地址和tblPointLine地址,但不是设备2:

    ;WITH MyCTE AS
    (
    SELECT *,
           ROW_NUMBER() OVER(PARTITION BY ControllerLineID ORDER BY ModuleLineID) AS NewVariation
    FROM   ModuleLine
    )
    UPDATE MyCTE 
    SET    Address = (NewVariation * 100) + 1001
    

    现在您可以看到添加第二个设备的时间,它被给出并且地址为1201(每次添加一个附加设备时会增加100个)这就是为什么在PointLine上,下一组8个点有一个地址从1201 - 1204开始。

    现在基于InputType,无论是输入还是输出,我都需要这个自动增量来考虑它以及DeviceLineID和PointLineID。所以这就是1201-1204出现两次的原因。

    如果可以在SQL中进行这种自动增量,有没有人有任何想法?

    基本上我需要改变(NewVariation)

    • 所以它增加100,而不是控制器
    • 为1
    • 所以它对于设备1递增1,然后在ControllerLineID改变时递增100

    感谢您的帮助,我希望这更容易理解

1 个答案:

答案 0 :(得分:0)

到目前为止,这不是最好的答案,但它可以满足我的需求,如果有人能让它变得更简单,我将非常感激:

---------------------------------------------------------------------------------
----------------------------CONTROLLER LINE COUNT--------------------------------
---------------------------------------------------------------------------------

;WITH MyCTE AS
(
    SELECT *,
           ROW_NUMBER() OVER(PARTITION BY ControlBoardID ORDER BY ControllerLineID) AS NewVariation
    FROM   ControllerLine
)
UPDATE MyCTE 
SET    ControllerCount = NewVariation 

---------------------------------------------------------------------------------
-----------------------------UPDATE COUNTER IN DEVICE----------------------------
---------------------------------------------------------------------------------

UPDATE DeviceLine set DeviceCount = ControllerCount 
FROM ControllerLine
Where DeviceLine.ControllerLineID = ControllerLine.ControllerLineID  

---------------------------------------------------------------------------------
---------------------------DEVICE LINE CONTROLLER COUNT--------------------------
---------------------------------------------------------------------------------

;WITH MyCTE AS
(
    SELECT *,
           ROW_NUMBER() OVER(PARTITION BY ControllerLineID ORDER BY DeviceLineID) AS NewVariation
    FROM   DeviceLine
)
UPDATE MyCTE 
SET    Address = (DeviceCount*1000) + (NewVariation * 100) + 1

根据上面的问题,我在ControllerLine表和DeviceLine表中添加了一个count列,这使我能够从头开始为他们连接的每个ControlBoard创建变量。

相关问题