2011-04-17 71 views
1
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 

我想要得到的是LEFT JOIN不從MS Access中的左表中返回完整的行?

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"; 

回答

5

有兩個(巧妙地)不同的方式做到這一點:

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) 
+0

第一次給我「Join Test表達式不支持在'Tests.Release = ..'部分。第二個工程,但很想知道它的區別,並確保它包含我想要的內容。 – Pablo 2011-04-17 14:20:48

+0

與您的指出案例和第二種方式,我仍然沒有從測試案例中得到整套行。 – Pablo 2011-04-17 14:34:55

+0

@Michael:編輯了第一個查詢,它需要一對括號。 – 2011-04-17 15:47:41

3

將過濾器到您的加盟標準,因此,它的應用作爲連接的一部分,而不是事後過濾。例如:

SELECT Testcases.Testcase, Tests.Result 
FROM (Testcases LEFT JOIN Tests ON ((Testcases.ID=Tests.TestCaseID) 
AND (Tests.Release="1.1.111"))) 
+1

當你在where子句中添加一個條件時,它會在你的左連接表中創建一個內連接,所以@steve說,你需要移動條件 – 2011-04-17 14:08:54

+0

MS Access不接受這...也嘗試與大括號,相同的結果:( – Pablo 2011-04-17 14:10:23

+0

如何「移動」條件球員? – Pablo 2011-04-17 14:13:41