一个子查询返回值多于一个的错误

创建一个学生,教师,以及记录多对多关系的学生教师关系表:

create table teacher
(
id varchar(40) primary key,
name varchar(20)
);

create table student
(
id varchar(40) primary key,
name varchar(20)
);
create table teacher_student
(
t_id varchar(40),
s_id varchar(40),
primary key(t_id,s_id),
constraint t_id_FK foreign key (t_id) references teacher(id),
constraint s_id_FK foreign key (s_id) references student(id)
);

在查找教师实体时遇到一个错误,查方法的源码是:

public Teacher find_t(String id) throws SQLException{
QueryRunner qr = new QueryRunner(JdbcUtils_C3P0.getDs());
String sql = "select * from teacher where id=?";
Teacher t =  (Teacher) qr.query(sql, id, new BeanHandler(Teacher.class));

//根据外键关系表,取出学生的信息
//这个sql语句是错误的额,子查询返回的值多余一个,
sql = "select * from student where id=(select s_id from teacher_student where t_id=?)";
List<Student> list = (List<Student>) qr.query(sql, t.getId(), new BeanListHandler(Student.class));
t.getSet().addAll(list);

return t;
}

运行结果报错为:

java.sql.SQLException: Subquery returns more than 1 row Query: select * from student where id=(select s_id from teacher_student where t_id=?) Parameters: [1]

因为教师可以对应着多个学生,所以子查询返回的值自然可以多于一个,而当子查询跟随在=、~=、<、<=、>、>=之后或子查询用作表达式时,这种情况是不允许的。

所以sql语句应该使用连接查询:sql="select * from student s,teacher_student t_s where s.id=t_s.s_id and t_s.t_id=?";

好的,这是一个比较复杂的问题,需要用到一些基本的计算机编程知识。以下是一个简单的Python程序,可以实现所需的功能: ```python from math import sqrt def clear(): expression.set("") def calculate(): try: result = eval(expression.get()) expression.set(result) except: expression.set("Error") def add_to_expression(char): if expression.get() == "Error": expression.set("") expression.set(expression.get() + char) def add(): add_to_expression("+") def subtract(): add_to_expression("-") def multiply(): add_to_expression("*") def divide(): add_to_expression("/") def integer_divide(): add_to_expression("//") def power(): add_to_expression("**") def square_root(): try: result = sqrt(eval(expression.get())) expression.set(result) except: expression.set("Error") # 这里使用了Tkinter库来创建图形用户界面 from tkinter import * root = Tk() root.title("Calculator") expression = StringVar() expression.set("") # 创建文本框 entry = Entry(root, textvariable=expression, justify=RIGHT) entry.grid(row=0, column=0, columnspan=4, padx=5, pady=5) # 创建数字按钮 for i in range(10): button = Button(root, text=str(i), command=lambda x=i:add_to_expression(str(x))) button.grid(row=(i+3)//3, column=(i-1)%3, padx=5, pady=5) # 创建操作符按钮 Button(root, text="+", command=add).grid(row=3, column=3, padx=5, pady=5) Button(root, text="-", command=subtract).grid(row=4, column=3, padx=5, pady=5) Button(root, text="*", command=multiply).grid(row=5, column=3, padx=5, pady=5) Button(root, text="/", command=divide).grid(row=6, column=3, padx=5, pady=5) Button(root, text="//", command=integer_divide).grid(row=3, column=2, padx=5, pady=5) Button(root, text="**", command=power).grid(row=4, column=2, padx=5, pady=5) Button(root, text="sqrt", command=square_root).grid(row=5, column=2, padx=5, pady=5) # 创建clear按钮和=按钮 Button(root, text="clear", command=clear).grid(row=6, column=0, padx=5, pady=5) Button(root, text="=", command=calculate).grid(row=6, column=1, padx=5, pady=5) root.mainloop() ``` 这个程序使用了Tkinter库来创建图形用户界面,包括一个文本框、数字按钮、操作符按钮、clear按钮和=按钮。当用户单击数字按钮时,程序会将该数字添加到文本框中的表达式中;当用户单击操作符按钮时,程序会将该操作符添加到表达式中。单击clear按钮时,程序会清除文本框中的表达式;单击=按钮时,程序会计算表达式的,并将结果显示在文本框中。 在程序中,我们使用了Python的eval函数来计算表达式的。这个函数可以将一个字符串解析为一个表达式,并返回表达式的。例如,eval("2+3")的返回值为5。 在实现计算器功能时,我们还需要进行一些错误检查。例如,如果表达式中包含了多余的小数点或连续的运算符,程序就会提示错误。在这个程序中,我们使用了try和except语句来捕获这些错误,并将错误提示显示在文本框中。 这个程序还支持整除、幂运算和平方根运算。其中,整除运算使用了Python的//运算符,幂运算使用了**运算符,平方根运算使用了math库中的sqrt函数。 希望这个程序可以帮助你更好地理解计算器的实现原理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值