Python SQLite3-交叉表选择查询
我想要返回的是性能表中的所有座位id,其预订id与预订表中的所有预订id(其中night=1)匹配-内部联接是最好的方式吗 还是更像是从演出中选择座位号,预订中的座位号=选择,预订中的夜晚号 通过以上操作,我得到了sqlite3.OperationalError:不完整的输入错误Python SQLite3-交叉表选择查询,python,sql,sqlite,select,Python,Sql,Sqlite,Select,我想要返回的是性能表中的所有座位id,其预订id与预订表中的所有预订id(其中night=1)匹配-内部联接是最好的方式吗 还是更像是从演出中选择座位号,预订中的座位号=选择,预订中的夜晚号 通过以上操作,我得到了sqlite3.OperationalError:不完整的输入错误 有了这个,我得到了ValueError:参数的类型是不受支持的错误。您正在将列表结果与整数进行比较 此选项从预订中选择*,其中夜间=?=>返回N行的值 您正在等待从performance中选择一个整数seat\u id
有了这个,我得到了ValueError:参数的类型是不受支持的错误。您正在将列表结果与整数进行比较 此选项从预订中选择*,其中夜间=?=>返回N行的值 您正在等待从performance中选择一个整数seat\u id,其中booking\u id= 您必须使用以下内容:
SELECT seat_id FROM performance WHERE booking_id in (SELECT * FROM booking WHERE night = ?""", (night_number))
首先,如果这是您的实际代码,那么在性能表的CREATE语句中有一个输入错误。 您必须在以下步骤的末尾删除:
FOREIGN KEY (booking_id) REFERENCES booking(booking_id),
那么,这里:
cursor.execute("""SELECT seat_id FROM performance WHERE booking_id=(SELECT * FROM booking WHERE night = ?""", (night_number))
sql语句缺少右括号,子查询可能返回多行,因此应在中使用而不是=。
此外,参数night_number应作为元组传递,而不仅仅是一个数字,方法是在paraenthese中添加a:
cursor.execute("""SELECT seat_id FROM performance WHERE booking_id IN (SELECT * FROM booking WHERE night = ?)""", (night_number,))
对于join,您需要一个适当的ON子句,该子句链接表和,以创建night_number的元组:
在这两种情况下,中的运算符和联接都将起作用。
还有另一种选择有时表现更好,这是存在的:
错误仍然存在,因为您没有传递元组。好的,谢谢您-我有点困惑sql变量是用于什么以及b和p来自哪里。这是SELECT语句之上必需的吗?@BenjaminMcDowell sql变量存储sql语句,它是execute的第一个参数。p和b是表的别名,它们用于限定列名,以便不存在歧义。例如:b.booking\u id=p.booking\u id可以明确哪个列是哪个列,因为b表示预订,p表示绩效。
cursor.execute("""SELECT seat_id FROM performance WHERE booking_id IN (SELECT * FROM booking WHERE night = ?)""", (night_number,))
sql = """
SELECT p.seat_id
FROM performance p INNER JOIN booking b
ON b.booking_id = p. booking_id
WHERE b.night=?
"""
cursor.execute(sql, (night_number,))
sql = """
SELECT p.seat_id
FROM performance p
WHERE EXISTS (
SELECT 1 FROM booking b
WHERE b.night=? AND b.booking_id = p.booking_id
)
"""
cursor.execute(sql, (night_number,))