You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中SQLite 2.6.0执行查询遇OperationalError语法错误求助

问题解决:SQLite查询预订所有船只的水手姓名报错

错误原因

你的SQL查询触发OperationalError: near "(": syntax error,是因为SQLite不支持在NOT EXISTS子句中直接使用EXCEPT的嵌套写法,导致语法解析失败。

正确查询方案

方案1:COUNT统计匹配(直观兼容)

通过统计水手预订的不同船只数量,判断是否等于所有船只的总数,实现需求:

answer = """
SELECT S.sname 
FROM Sailor S
JOIN Reserve R ON S.sid = R.sid
GROUP BY S.sid, S.sname
HAVING COUNT(DISTINCT R.bid) = (SELECT COUNT(*) FROM Boat)
"""

方案2:修正NOT EXISTS+EXCEPT语法

如果坚持使用原逻辑,需要将EXCEPT的结果包裹在带别名的子查询中:

answer = """
SELECT S.sname 
FROM Sailor S 
WHERE NOT EXISTS (
    SELECT * 
    FROM (
        SELECT B.bid FROM Boat B 
        EXCEPT 
        SELECT R.bid FROM Reserve R WHERE R.sid = S.sid
    ) AS UnreservedBoats
)
"""

替换后的代码片段

将原代码中的answer变量替换为上述任意一个即可,完整示例:

print('Q1: Find the name of the sailor who reserved all boats')
print('Your answer should include (sname)')

# 选用方案1的查询
answer = """
SELECT S.sname 
FROM Sailor S
JOIN Reserve R ON S.sid = R.sid
GROUP BY S.sid, S.sname
HAVING COUNT(DISTINCT R.bid) = (SELECT COUNT(*) FROM Boat)
"""

t = cur.execute(answer)
names = list(map(lambda x: x[0], t.description))
print(names)
print('--------------------')
for row in t : print(row)
print('--------------------')

内容的提问来源于stack exchange,提问作者Francisco Salazar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 12:03:24