Sqlite:select,在连接字段中使用 like 连接
Sqlite: select, join using like for the join fields
这是在 sqlite 3 中
我将位置编号和地址合二为一 table(存储为 CHAR)
我在另一个 table 中有设备名称和其他详细信息,其中设备名称存储为 CHAR,位置编号是一个子字符串或等于设备名称
我希望能够 select 所有位置并计算位于该位置的设备数量,按位置编号分组
这是我正在使用的
SELECT v.[TransitNumber],DeviceName,count(NeighborName) from Neighbors n
left join VirtualControllers v on v.TransitNumber like '%'+n.DeviceName+'%'
group by DeviceName
这个returns我中转号的值为空,我不明白为什么
这是一些数据
TransitNumber DeviceName count(NeighborName)
712bs1 2
712bs2 2
在这种情况下,中转号码应该是 712(顺便说一句,我实际上是在计算每台设备连接了多少台 PC,但我想知道该位置有多少台 PC
结果应该是
TransitNumber count(NeighborName)
712 4
这是一些数据示例以及我想要实现的目标
Neighbours table
DeviceName Interface NeighbourName
us712bs1 fa0/1 PC1
us712bs1 fa0/2 PC2
us712bs2 fa0/1 PC3
us712bs2 fa0/2 PC4
VirtualCotroller table
TransitNumber Address
712 New York, TimeSquare
Expected result
TransitNumber PCs
712 4
首先,DeviceName
属于哪个table? Neighbors
?如果是这样,您需要使用在 VirtualControllers
上引用 Neighbors
的 外键 来制作 JOIN
然后使用 LIKE
在 WHERE
子句中。我会假装你在 VirtualControllers
table 上有一个 fk_id_neighbor
,在 Neighbor
table 上有一个 id_neighbor
。这样的东西应该可以工作
SELECT n.DeviceName, n.Id_Neighbor, count(n.NeighborName) AS qtd, v.TransitNumber, v.FK_Id_Neighbor
FROM Neighbors n
LEFT JOIN VirtualControllers AS v ON v.TransitNumber.FK_Id_Neighbor=
n.Id_Neighbor
WHERE v.TransitNumber LIKE '%'+n.DeviceName+'%'
GROUP BY n.DeviceName
您可以在 LIKE
语句中使用 CONCAT
,但我不推荐。
这个比较是错误的:
v.TransitNumber like '%'+n.DeviceName+'%'
当您尝试使用一些示例值时,您会得到:
'712' LIKE '%us712bs1%'
但你想要反过来:
'us712bs1' LIKE '%712%'
即:
n.DeviceName like '%'+v.TransitNumber+'%'
Here是fiddle随心所欲
我将其保留为左外连接,因为这意味着您将获得没有邻居的 VirtualController 的零计数(而不是仅仅排除缺失的行 - 如果您想排除它们,请将其更改为成为一个内部连接)
主要问题是您在 LIKE 中的串联,SQLite 使用双管道 ||对于字符串连接不是 +.
上面fiddle有两个select,第一个给你要的,计数为4。第二个也是按设备名分组,方便你看区别两人
你的 SQL 结果如下:
SELECT TransitNumber, DeviceName, COUNT (NeighbourName)
FROM VirtualController V
LEFT OUTER JOIN Neighbours N ON N.DeviceName LIKE '%' || V.TransitNumber || '%'
GROUP BY TransitNumber;
这是在 sqlite 3 中
我将位置编号和地址合二为一 table(存储为 CHAR)
我在另一个 table 中有设备名称和其他详细信息,其中设备名称存储为 CHAR,位置编号是一个子字符串或等于设备名称
我希望能够 select 所有位置并计算位于该位置的设备数量,按位置编号分组
这是我正在使用的
SELECT v.[TransitNumber],DeviceName,count(NeighborName) from Neighbors n left join VirtualControllers v on v.TransitNumber like '%'+n.DeviceName+'%' group by DeviceName
这个returns我中转号的值为空,我不明白为什么
这是一些数据
TransitNumber DeviceName count(NeighborName)
712bs1 2
712bs2 2
在这种情况下,中转号码应该是 712(顺便说一句,我实际上是在计算每台设备连接了多少台 PC,但我想知道该位置有多少台 PC
结果应该是
TransitNumber count(NeighborName)
712 4
这是一些数据示例以及我想要实现的目标
Neighbours table
DeviceName Interface NeighbourName
us712bs1 fa0/1 PC1
us712bs1 fa0/2 PC2
us712bs2 fa0/1 PC3
us712bs2 fa0/2 PC4
VirtualCotroller table
TransitNumber Address
712 New York, TimeSquare
Expected result
TransitNumber PCs
712 4
首先,DeviceName
属于哪个table? Neighbors
?如果是这样,您需要使用在 VirtualControllers
上引用 Neighbors
的 外键 来制作 JOIN
然后使用 LIKE
在 WHERE
子句中。我会假装你在 VirtualControllers
table 上有一个 fk_id_neighbor
,在 Neighbor
table 上有一个 id_neighbor
。这样的东西应该可以工作
SELECT n.DeviceName, n.Id_Neighbor, count(n.NeighborName) AS qtd, v.TransitNumber, v.FK_Id_Neighbor
FROM Neighbors n
LEFT JOIN VirtualControllers AS v ON v.TransitNumber.FK_Id_Neighbor=
n.Id_Neighbor
WHERE v.TransitNumber LIKE '%'+n.DeviceName+'%'
GROUP BY n.DeviceName
您可以在 LIKE
语句中使用 CONCAT
,但我不推荐。
这个比较是错误的:
v.TransitNumber like '%'+n.DeviceName+'%'
当您尝试使用一些示例值时,您会得到:
'712' LIKE '%us712bs1%'
但你想要反过来:
'us712bs1' LIKE '%712%'
即:
n.DeviceName like '%'+v.TransitNumber+'%'
Here是fiddle随心所欲
我将其保留为左外连接,因为这意味着您将获得没有邻居的 VirtualController 的零计数(而不是仅仅排除缺失的行 - 如果您想排除它们,请将其更改为成为一个内部连接)
主要问题是您在 LIKE 中的串联,SQLite 使用双管道 ||对于字符串连接不是 +.
上面fiddle有两个select,第一个给你要的,计数为4。第二个也是按设备名分组,方便你看区别两人
你的 SQL 结果如下:
SELECT TransitNumber, DeviceName, COUNT (NeighbourName)
FROM VirtualController V
LEFT OUTER JOIN Neighbours N ON N.DeviceName LIKE '%' || V.TransitNumber || '%'
GROUP BY TransitNumber;