2017-07-02 68 views
-1

我有这个疑问: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) 
); 
+0

您是否可以编辑您的问题以包含表格模式并在表格中提供最少的一组数据以显示您遇到的错误行为? – CDahn

+0

@CDahn打败了我:) – Jim

+0

对不起。我已经添加了表格。 – Mizan

回答

0

若(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的忙。这看起来像是使用它们的理想代码片段。

+0

where语句在语义上等同于on语句,因为它限制了输出。根据DBMS的不同,它可能效率不高。最糟糕的是,他的'INNER JOIN'正在生产两张桌子的完整笛卡尔产品,而WHERE正在放弃他不想要的所有东西。无论哪种方式,你提供的'on'应该为他提供与'where'相同的输出。 – CDahn

+0

非常感谢。这可能是问题。我会测试一下并回复你。谢谢您的帮助! – Mizan

+0

@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

0

这似乎是你的数据集不包含在next_workout_exercises一行包含next_idexercise_numberset_number您使用的是第二个查询。

你的第一个查询只说:“给我所有的独特SET_NUMBER值从表中,” 但并不保证set_number你在第二个查询指定是从第一组唯一的查询。

+0

不,我检查过,第二个查询使用了第一个存在的那些设置数字。 – Mizan

+0

@Mizan样本数据或它没有发生。 – CDahn