Sqlite:选择,使用类似的连接字段进行连接

Min*_*iMe 2 sqlite join sql-like

这是在 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
Run Code Online (Sandbox Code Playgroud)

这使我返回 Null 的转运号码值,我不明白为什么

这是一些数据

TransitNumber   DeviceName  count(NeighborName)  
                712bs1       2  
                712bs2       2  
Run Code Online (Sandbox Code Playgroud)

在这种情况下,传输号码应该是 712 (顺便说一句,我实际上正在计算每个设备连接了多少台 PC,但我想知道该位置有多少台 PC
结果应该是

TransitNumber   count(NeighborName)
712               4
Run Code Online (Sandbox Code Playgroud)

这是一些数据示例以及我想要实现的目标

    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
Run Code Online (Sandbox Code Playgroud)

Jam*_*ard 5

是你想要的东西。

我将其保留为左外连接,因为这意味着您将获得没有邻居的 VirtualController 的计数为零(而不是仅仅排除丢失的行 - 如果您想排除它们,请将其更改为 INNER JOIN)

主要问题是你的 LIKE 中的串联,SQLite 使用双管道 || 对于字符串连接不是 +。

上面的小提琴中有两个选择,第一个给出您所要求的内容,计数为 4。第二个也按设备名称分组,以防您想了解两者之间的区别。

您的 SQL 最终如下所示:

SELECT TransitNumber, DeviceName, COUNT (NeighbourName)
FROM VirtualController V
LEFT OUTER JOIN Neighbours N ON N.DeviceName LIKE '%' || V.TransitNumber || '%'
GROUP BY TransitNumber;
Run Code Online (Sandbox Code Playgroud)