Python SQL语句,如何在sqlite3中的id列表上连接id

Python SQL语句,如何在sqlite3中的id列表上连接id,python,pandas,sqlite,Python,Pandas,Sqlite,首先,我对SQL非常陌生,所以实现可能不是传统的:) 我正在使用sqlite3和pandas并试图用join语句链接两个表(设备和测试)。我想查询与Test_1关联的所有设备,而不知道它的名称、id或有多少设备。例如,一个SQL查询的结果如下: "SELECT * FROM Tests JOIN Device ON Devices.id = Tests.Device_ids WHERE Devices.name = 'Device_1'" 我遇到的问题是,我需要多个设备来执

首先,我对SQL非常陌生,所以实现可能不是传统的:) 我正在使用
sqlite3
pandas
并试图用join语句链接两个表(设备和测试)。我想查询与Test_1关联的所有设备,而不知道它的名称、id或有多少设备。例如,一个SQL查询的结果如下:

"SELECT * FROM Tests
JOIN Device ON Devices.id = Tests.Device_ids
WHERE Devices.name = 'Device_1'"
我遇到的问题是,我需要多个设备来执行测试。当我使用
pandas
dataFrame.to_sql()
sqlite3
时,唯一的选项(如我所见)是将设备id存储为列表的字符串(选项1)或具有相同id的条目(选项2)

我想要的输出是:

| id | Name | Device_ids | | 1 | Test_1 | '[1, 3]' | |id |名称|设备| id | |1 |测试1 |“[1,3]”
首先,在SQL中使用联接查询的正确方法是每行有一个数据。这意味着唯一可用的选项是2。但是您可以使用
explode
轻松地从代码转换:

...
tests = {'id':[1,2], 'name':['test_1', 'test_2'], 'device_ids':[[1,3],[2,3]]}
tests = pd.DataFrame(tests).explode('device_ids')
print(tests)
tests.to_sql('tests', con)
...
然后,要获取测试所需的设备,您可以使用:

con.execute("""SELECT devices.* FROM devices
JOIN tests ON tests.device_ids = devices.id
WHERE tests.name = ?""", ('test_1',)).fetchall()
正如预期的那样:

[(0, 1, 'Device_1'), (2, 3, 'Device_3')]

您可以将[内部]
JOIN
替换为
LEFT JOIN
选项2:不将设备_3作为测试_1的一部分返回您的查询搜索的是“设备_1”而不是“设备_3”。明确你想要什么。你没有清楚地说明你的投入和预期的产出。此外,初始SQL查询不正确,因为is从
测试中进行选择,在
测试中进行连接(再次),然后使用未引用的表
设备
。。。。
con.execute("""SELECT devices.* FROM devices
JOIN tests ON tests.device_ids = devices.id
WHERE tests.name = ?""", ('test_1',)).fetchall()
[(0, 1, 'Device_1'), (2, 3, 'Device_3')]