首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在MS Access中,左连接没有从左表返回整行吗?

在MS Access中,左连接没有从左表返回整行吗?
EN

Stack Overflow用户
提问于 2011-04-17 22:03:15
回答 2查看 4.3K关注 0票数 2
代码语言:javascript
复制
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

我想得到的是

代码语言:javascript
复制
Testcase Result
TC-1     OK
TC-5     <empty>
TC-8     FAIL

我得到的是

代码语言:javascript
复制
Testcase Result
TC-1     OK
TC-8     FAIL

查询:

代码语言:javascript
复制
SELECT Testcases.Testcase, Tests.Result
FROM Testcases LEFT JOIN Tests ON Testcases.ID=Tests.TestCaseID
WHERE Tests.Release="1.1.111";
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-04-17 22:17:08

有两种(微妙的)不同的方法:

代码语言:javascript
复制
SELECT Testcases.Testcase
     , Tests.Result
FROM Testcases
  LEFT JOIN Tests
    ON (  ( Testcases.ID = Tests.TestCaseID )
      AND ( Tests.Release = "1.1.111" )
       )

和:

代码语言:javascript
复制
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

使用ID=4, Testcase=20在表Testcases中再插入一行

并在表Tests中添加一行,使用TestCaseID=4 Result="Whatever" Release="2.2.37"查看这两个选项之间的差异。

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

第二个将只显示使用Release="1.1.111"进行测试的Testscases。以及没有任何测试的所有测试用例。

注意:第一个查询不能在Access的“设计”模式下显示。您可以在SQL模式下保存它,但如果您关闭并重新打开它,Access似乎会擦除一些未知原因的括号。不过,您仍然可以运行它。

它(第一个查询)也可以写成:

代码语言:javascript
复制
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 )

代码语言:javascript
复制
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" )
  )

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

代码语言:javascript
复制
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)
票数 5
EN

Stack Overflow用户

发布于 2011-04-17 22:07:21

将筛选器放入您的联接条件中,以便将其作为联接的一部分应用,而不是在以后进行筛选。例如:

代码语言:javascript
复制
SELECT Testcases.Testcase, Tests.Result
FROM (Testcases LEFT JOIN Tests ON ((Testcases.ID=Tests.TestCaseID)
 AND (Tests.Release="1.1.111")))
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5693955

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档