LEFT JOIN不从MS Access中的左表返回完整行?

Pab*_*blo 2 database ms-access ms-access-2007

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
Run Code Online (Sandbox Code Playgroud)

我想得到的是

Testcase Result
TC-1     OK
TC-5     <empty>
TC-8     FAIL
Run Code Online (Sandbox Code Playgroud)

我得到的是

Testcase Result
TC-1     OK
TC-8     FAIL
Run Code Online (Sandbox Code Playgroud)

查询:

SELECT Testcases.Testcase, Tests.Result
FROM Testcases LEFT JOIN Tests ON Testcases.ID=Tests.TestCaseID
WHERE Tests.Release="1.1.111";
Run Code Online (Sandbox Code Playgroud)

ype*_*eᵀᴹ 5

有两种(巧妙地)不同的方法可以做到这一点:

SELECT Testcases.Testcase
     , Tests.Result
FROM Testcases
  LEFT JOIN Tests
    ON (  ( Testcases.ID = Tests.TestCaseID )
      AND ( Tests.Release = "1.1.111" )
       )
Run Code Online (Sandbox Code Playgroud)

和:

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
Run Code Online (Sandbox Code Playgroud)

插入一个多行插入表中Testcases,与ID=4, Testcase=20

和一行进入表格Tests,TestCaseID=4 Result="Whatever" Release="2.2.37"看看两个选项之间的区别.

简而言之,第一个查询将显示所有测试用例,结果仅显示测试结果Release="1.1.111",其余测试用例将结果显示为空(NULL).

第二个将仅显示测试用的测试用例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 )
Run Code Online (Sandbox Code Playgroud)

要么

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" )
  )
Run Code Online (Sandbox Code Playgroud)

甚至更好(因为它可以在设计模式下显示):

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)
Run Code Online (Sandbox Code Playgroud)