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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...