Python SQL语句,如何在sqlite3中的id列表上连接id
首先,我对SQL非常陌生,所以实现可能不是传统的:) 我正在使用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'" 我遇到的问题是,我需要多个设备来执
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')]