有兩個(巧妙地)不同的方式做到這一點:
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
和表Tests
中的一行,TestCaseID=4 Result="Whatever" Release="2.2.37"
查看2個選項之間的區別。
簡而言之,第一個查詢將顯示所有Testscases,其結果僅顯示用於具有Release="1.1.111"
的測試,其餘測試用例將顯示結果爲空(NULL)。
第二個將只顯示Testscases與Release="1.1.111"
測試。也沒有任何測試的所有Testcase。
注意:第一個查詢不能以Access的「設計」模式顯示。您可以將其保存爲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
, IIf((Tests.Release="1.1.111"), Tests.Result, Null)
第一次給我「Join Test表達式不支持在'Tests.Release = ..'部分。第二個工程,但很想知道它的區別,並確保它包含我想要的內容。 – Pablo 2011-04-17 14:20:48
與您的指出案例和第二種方式,我仍然沒有從測試案例中得到整套行。 – Pablo 2011-04-17 14:34:55
@Michael:編輯了第一個查詢,它需要一對括號。 – 2011-04-17 15:47:41