问题描述
|
Testcases table
---------------
ID Testcase
1 TC-1
2 TC-5
3 TC-8
Tests table
-----------
ID TestCaseID Result Release
1 1 OK 1.1.111
2 3 FAIL 1.1.111
我想要得到的是
Testcase Result
TC-1 OK
TC-5 <empty>
TC-8 FAIL
我得到的是
Testcase Result
TC-1 OK
TC-8 FAIL
查询:
SELECT Testcases.Testcase,Tests.Result
FROM Testcases LEFT JOIN Tests ON Testcases.ID=Tests.TestCaseID
WHERE Tests.Release=\"1.1.111\";
解决方法
有两种(巧妙地)不同的方法可以做到这一点:
SELECT Testcases.Testcase,Tests.Result
FROM Testcases
LEFT JOIN Tests
ON ( ( Testcases.ID = Tests.TestCaseID )
AND ( Tests.Release = \"1.1.111\" )
)
和:
SELECT Testcases.Testcase,Tests.Result
FROM Testcases
LEFT JOIN Tests
ON Testcases.ID = Tests.TestCaseID
WHERE Tests.Release = \"1.1.111\"
OR Tests.TestCaseID IS NULL
在表Testcases
和ID=4,Testcase=20
中再插入一行
然后在表table8ѭ中一行,用TestCaseID=4 Result=\"Whatever\" Release=\"2.2.37\"
查看两个选项之间的区别。
简而言之,第一个查询将显示所有测试用例,仅针对具有Release=\"1.1.111\"
的测试显示结果,其余测试用例将显示结果为空(NULL)。
第二个将仅显示具有Release=\"1.1.111\"
测试的Testscase。以及所有Testcase,无需任何测试。
注意:第一个查询无法以Access \'\“ Design \”模式显示。您可以将其保存为SQL模式,但是如果您关闭并重新打开它,则Access会出于未知原因删除一些括号。您仍然可以运行它。
它(第一个查询)也可以写成:
SELECT Testcases.Testcase,g.Result
FROM Testcases
LEFT JOIN
( SELECT *
FROM Tests
WHERE ( Tests.Release = \"1.1.111\" )
)
AS g
ON ( Testcases.ID = g.TestCaseID )
要么
SELECT Testcases.TestCase,Tests.Result
FROM Testcases
INNER JOIN Tests
ON ( Testcases.ID = Tests.TestCaseID )
WHERE ( Tests.Release = \"1.1.111\" )
UNION ALL
SELECT Testcases.TestCase,NULL
FROM Testcases
WHERE NOT EXISTS
( SELECT 1
FROM Tests
WHERE ( Testcases.ID = Tests.TestCaseID )
AND ( Tests.Release = \"1.1.111\" )
)
甚至更好(因为它可以在“设计”模式下显示):
SELECT Testcases.Testcase,IIf((Tests.Release=\"1.1.111\"),Tests.Result,Null)
AS Result
FROM Testcases
LEFT JOIN Tests
ON Testcases.ID = Tests.TestCaseID
GROUP BY Testcases.Testcase,Null)
,将过滤器放入联接条件中,以便将其应用为联接的一部分,而不是随后进行过滤。例如。:
SELECT Testcases.Testcase,Tests.Result
FROM (Testcases LEFT JOIN Tests ON ((Testcases.ID=Tests.TestCaseID)
AND (Tests.Release=\"1.1.111\")))