2014-04-22 258 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

相关问题