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示例数据或它没有发生。