以下是我正在使用的5个表的entityRelationship图:
以下是我想要实现的一些示例数据:
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
这是如何运作的:
现在我的问题是解决设备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)
感谢您的帮助,我希望这更容易理解
答案 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创建变量。