不能从MS Access的左表中返回完整行的左联接?

|
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
       , IIf((Tests.Release=\"1.1.111\"), Tests.Result, Null)
    
将过滤器放入联接条件中,以便将其应用为联接的一部分,而不是随后进行过滤。例如。:
SELECT Testcases.Testcase, Tests.Result
FROM (Testcases LEFT JOIN Tests ON ((Testcases.ID=Tests.TestCaseID)
 AND (Tests.Release=\"1.1.111\")))
    

要回复问题请先登录注册