SQL查询有时返回错误的结果
我有一个疑问:SQL查询有时返回错误的结果,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_wor
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_编号与第一次查询相同,没有数据更改
有人能评论一下为什么会发生这种情况吗
有关表格:
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)您的第二个查询使用的是相同的workUtid和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一个忙。这看起来是使用它们的理想代码。您的数据集似乎没有在
next\u-workout\u-exercises
中包含一行,该行包含您在第二次查询中使用的next\u-id
和exercise\u-number
您的第一个查询只是说“给我表中所有唯一的set_number值,”但这不能保证您在第二个查询中指定的
集合编号
来自第一个查询中的唯一集合。您能编辑您的问题以包括表架构并在表中提供显示您所经历的错误行为的最小数据集吗?@CDahn告诉我:)对不起关于那件事。我已经添加了这些表。@Mizan如果您可以将这些表格式化为代码块,那么将来的读者分析您的问题会很有帮助。另外,请给我们一些示例数据,以便我们了解这些数据可能会如何影响您的查询。编辑这一切都要感谢Felix Pamittan。我不能提供数据,因为在我自己的数据和机器上,这工作正常。我有一个android应用程序,它给出了一个异常,我可以看到第一个查询返回了一些结果,但第二个查询没有返回不应该发生的任何结果。where
子句在语义上等同于on
语句,因为它限制了输出。根据DBMS的不同,它可能没有那么有效。最糟糕的情况是,他的内部联接正在生成两个表的完全笛卡尔积,而WHERE正在删除他不想要的所有内容。无论哪种方式,您提供的
上的都应该为他提供与他的where
相同的输出。非常感谢。这可能就是问题所在。我会测试一下,然后再给你回复。谢谢你的帮助@Mizan看一下这些其他优秀的SO问题,看看ON
与WHERE
:,和的相关性。没有,我已经检查过,第二个查询使用了第一个查询中存在的那些集合数。@Mizan示例数据或它没有发生。