2017-07-02 98 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