这是在sqlite 3中
我在一个表中有位置编号和地址(存储为CHAR)
我在另一个表中有设备名称和其他详细信息,其中设备名称存储为CHAR,位置编号是子字符串或等于设备名称
我希望能够选择所有位置并根据位置编号计算该位置的设备数量
以下是我正在使用的内容
SELECT v.[TransitNumber],DeviceName,count(NeighborName) from Neighbors n left join VirtualControllers v on v.TransitNumber like '%'+n.DeviceName+'%' group by DeviceName
这使我的过境号码的价值为空,我不会为什么
以下是一些数据
TransitNumber DeviceName count(NeighborName)
712bs1 2
712bs2 2
过境号码应该是712在这种情况下(BTW我实际上计算每台设备连接了多少台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
答案 0 :(得分:1)
Here是你想要的小提琴。
我把它留作左外连接,因为这意味着你将获得没有邻居的VirtualControllers包含零的数量(而不是仅仅排除丢失的行 - 如果你想要排除它们,将它改为INNER JOIN)
主要问题是你的LIKE连接,SQLite使用双管|| for string concatenation not +。
上面的小提琴中有两个选项,第一个给出了你要求的数量,数量为4.第二个也按设备名称分组,以防你想看到两者之间的区别。
您的SQL最终如下:
SELECT TransitNumber, DeviceName, COUNT (NeighbourName)
FROM VirtualController V
LEFT OUTER JOIN Neighbours N ON N.DeviceName LIKE '%' || V.TransitNumber || '%'
GROUP BY TransitNumber;
答案 1 :(得分:0)
首先,DeviceName
属于哪个表? Neighbors
?如果是这样,您需要使用引用Neighbors
VirtualControllers
的外键来制作JOIN
,然后使用LIKE
一个WHERE
条款。我会假装fk_id_neighbor
表上有VirtualControllers
,id_neighbor
表上有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
您可以在CONCAT
声明中使用LIKE
,但我不建议这样做。
答案 2 :(得分:0)
这种比较是错误的:
v.TransitNumber like '%'+n.DeviceName+'%'
当您尝试使用一些示例值时,您会得到:
'712' LIKE '%us712bs1%'
但你想要反过来说:
'us712bs1' LIKE '%712%'
即:
n.DeviceName like '%'+v.TransitNumber+'%'