Sqlite:选择,使用like作为连接字段

时间:2015-08-11 16:57:30

标签: 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

这使我的过境号码的价值为空,我不会为什么

以下是一些数据

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

3 个答案:

答案 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表上有VirtualControllersid_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+'%'