2014-04-22 540 views
0

我覺得我接近我的解決方案,但並不完全在那裏。我試圖選擇testRun.build兩次,從另一個表中選擇具有兩個不同外鍵的同一列

首次基於當前運行(Results.build_fk)並基於最後一次運行所在的測試通過(Results.lastPass)。

這是迄今爲止我選擇的聲明,我覺得應該工作(because of this answer),但它告訴我「子查詢返回多於一行」。

SELECT Results.build_fk, Results.testCaseID, Results.pass, Results.time, 

(SELECT testRun.build 

    FROM testRun 

INNER JOIN Results r1 ON r1.build_fk = testRun.runID 

) AS Last_build, 

(SELECT testRun.build 

    FROM testRun 

    INNER JOIN Results r2 ON r2.lastPass = testRun.runID 
) 
    AS Current_Build 

FROM Results 

    INNER JOIN testCases AS t1 ON t1.testCaseID = Results.testCaseID 

    ORDER BY build_fk DESC, testCaseID ASC; 

這裏是樣本表,樣本數據:

Results 
(`build_fk`, `testCaseID`, `pass`, `time`, `lastPass`) 
(1132, 200, 0, {some timestamp}, 1132) 
(1133, 200, 0, {some timestamp}, 1132) 
(1134, 200, 1, {some timestamp}, 1134) 
(1132, 210, 0, {some timestamp}, 1132) 
(1133, 210, 0, {some timestamp}, 1132) 
(1134, 210, 1, {some timestamp}, 1134) 

testRun 
(`runID`, `build`) 
(1132, 'build-1.0') 
(1133, 'build-1.1') 
(1134, 'build-1.2') 

對不起世界上沒有SQLFiddle,我不能讓它正確地創建表。

+0

相關的子查詢需要有一個'WHERE'子句與主查詢中的表連接。否則,它們將返回所有結果的行,與主SELECT中的行不同。 – Barmar

+0

你可以在你連接的答案中看到。 – Barmar

回答

3

我想在子查詢的附加連接是不必要的:

SELECT r.build_fk, r.testCaseID, r.pass, r.time, 
     (SELECT tr.build 
     FROM testRun tr 
     WHERE r.build_fk = tr.runID 
     ) AS Last_build, 
     (SELECT tr.build 
     FROM testRun tr 
     WHERE r.lastPass = tr.runID 
     ) AS Current_Build 
FROM Results r INNER JOIN 
    testCases t1 
    ON t1.testCaseID = r.testCaseID 
ORDER BY build_fk DESC, testCaseID ASC; 

你想要的子查詢(使用r表的別名在這個版本)來引用外部查詢。這被稱爲相關子查詢。

+0

這確實,謝謝你的幫助! – Wingdom

相關問題