当其中一个表中可能不存在数据时,选择具有多个联接的查询

时间:2013-01-24 18:11:29

标签: sql sql-server-2008 join

需要一些SQL查询帮助。

我有三个表TestOptions,CreateScript和TestResults。

Testoptions包含特定测试的所有数据。 CreateScript包含按顺序运行的测试集合,由index表示。 TestResults持有结果。

我想显示特定乐器的测试列表。该列表将包含。 TestType,TestName,测试限制和结果。某些测试可能尚未执行,因此测试结果表中将没有该测试的条目。如果尚未执行测试,则仍需要检索测试详细信息。该列表将按索引排序并按TestType分组。

到目前为止,我已经:

SELECT TestType, TestName, LowerLimits, UpperLimits, ResultRecorded  
FROM CreateScriptTable 
INNER JOIN TestOptionsTable ON CreateScriptTable.TestName =T estOptionsTable.TestName 
LEFT JOIN TestResultsTable ON CreateScriptTable.TestName = TestResultsTable.TestName 
WHERE CreateScriptTable.InstrumentType= 'instType' 
AND jobNo ='000'
AND SerialNo ='000'
ORDER BY [Index] ASC, TestType

SerialNo和JobNo仅在TestResults表中。 此查询仅提供已在测试结果表中输入的测试的详细信息。如果测试已经完成,我想要所有的测试细节和结果。

预期输出如下:

TestType    TestName    Lower       Upper       Result
type1       test1       12            20        12
type1       test2       96           108        105
type2       test2       98           108        
type3       test3       95           105

实际输出更像是

TestType    TestName    Lower       Upper       Result
type1       test1       12            20        12
type1       test2       96            108       105

仅测试结果表中的条目显示。

可能我没有正确接近连接。我已经弄乱了内,左,右和完全连接,但无济于事,现在我很难过。

1 个答案:

答案 0 :(得分:2)

您可以将左连接表中列的条件从WHERE子句移动到JOIN子句,以防止它们将左连接虚拟地更改为内部连接,如下所示:

SELECT TestType, TestName, LowerLimits, UpperLimits, ResultRecorded  
FROM CreateScriptTable 
INNER JOIN TestOptionsTable ON CreateScriptTable.TestName =TestOptionsTable.TestName 
LEFT JOIN TestResultsTable ON CreateScriptTable.TestName = TestResultsTable.TestName AND jobNo ='000' AND SerialNo ='000'
WHERE CreateScriptTable.InstrumentType= 'instType' 
ORDER BY [Index] ASC, TestType