SQL查询有时会返回错误结果
我有这个疑问:SQL查询有时会返回错误结果
query = "SELECT DISTINCT set_number " +
"FROM next_workout_exercises " +
"WHERE next_id = " + workoutid + " AND exercise_number = " + exercise_number;
,并返回了一定的成效。
在此之后,我有另外一个查询,如下所示:
query = "SELECT * FROM (SELECT * FROM next_workout_exercises INNER JOIN exercises WHERE next_workout_exercises.exercise_id = exercises.id)" +
" WHERE next_id = " + workoutid + " AND exercise_number = " + exercise_number + " AND set_number = " + set_number;
这有时会返回结果为零。 set_number与第一个查询相同,没有数据发生变化。
任何人都可以评论为什么会发生这种情况?
有问题的表格:
CREATE TABLE exercises
(
id INTEGER PRIMARY KEY,
exercise_name TEXT,
explanation TEXT,
type INTEGER,
target_body INTEGER,
exercise_video TEXT,
exercise_pic1 TEXT,
exercise_pic2 TEXT,
picturetype INTEGER,
backedup INTEGER
);
CREATE TABLE next_workout_exercises
(
id INTEGER PRIMARY KEY,
next_id INTEGER,
exercise_id INTEGER,
weightkg REAL,
weightlb REAL,
reps INTEGER,
reps2 INTEGER,
set_number INTEGER,
exercise_number INTEGER,
incrementkg REAL,
incrementlb REAL,
resttime1 INTEGER,
resttime2 INTEGER,
resttime3 INTEGER,
failures INTEGER,
failuresallowed INTEGER,
percentage REAL,
reptype INTEGER,
exercisetype INTEGER,
backedup INTEGER,
FOREIGN KEY(next_id) REFERENCES nextWorkout(id),
FOREIGN KEY(exercise_id) REFERENCES exercises(id)
);
若(a)没有人修改数据,(B)你的第二个查询使用您的第二个查询使用workoutid和exercise_number,以及(c)相同的值从第一个查询返回的set_number,那么它必须是真的,你错误地指定的连接条件是为什么你只是有时得到你想要的数据。
您指定连接条件是这样的:
ON next_workout_exercises.exercise_id = exercises.id
除非你写您的加入使用更为传统的手段你不使用WHERE子句做加盟。
一个更简洁的方式来写第二个查询是这样的:
SELECT n.*, e.*
FROM next_workout_exercises n
INNER JOIN exercises e ON n.exercise_id = e.id
WHERE n.next_id = :workoutid
AND n.exercise_number = :exercise_number
AND n.set_number = :set_number
哦,请使用占位符做你的DBA的忙。这看起来像是使用它们的理想代码片段。
where语句在语义上等同于on语句,因为它限制了输出。根据DBMS的不同,它可能效率不高。最糟糕的是,他的'INNER JOIN'正在生产两张桌子的完整笛卡尔产品,而WHERE正在放弃他不想要的所有东西。无论哪种方式,你提供的'on'应该为他提供与'where'相同的输出。 – CDahn
非常感谢。这可能是问题。我会测试一下并回复你。谢谢您的帮助! – Mizan
@Mizan看看这些其他优秀的SO问题,看看'ON'与'WHERE'的相关性:[1](https://stackoverflow.com/questions/1613304/ansi-joins-versus-where-clause -joins),[2](https://stackoverflow.com/questions/1018822/inner-join-on-vs-where-clause)和[3](https://stackoverflow.com/questions/354070/ SQL-加入-where子句-VS-on-子句)。 – CDahn
您是否可以编辑您的问题以包含表格模式并在表格中提供最少的一组数据以显示您遇到的错误行为? – CDahn
@CDahn打败了我:) – Jim
对不起。我已经添加了表格。 – Mizan