微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

FULL OUTER JOIN 不返回所有表的内容

如何解决FULL OUTER JOIN 不返回所有表的内容

我有下面提到的 3 个表。

表格

BUG

Id | Name | Other information ...
1  | Bug1 | ...
2  | Bug2 | ...
3  | Bug3 | ...
4  | Bug4 | ...
5  | Bug5 | ...

链接

Id  | Test_id | Bug_id
100 | 1000    | 4
101 | 1100    | 2
102 | 1200    | 2
103 | 1200    | 5

测试

Id   | Name | Other information ...
1000 | TC1  | ...
1100 | TC2  | ...
1200 | TC3  | ...
1300 | TC4  | ...
1400 | TC5  | ...
1500 | TC6  | ...

请求

SELECT Bug.Id,Bug.Name,Test.Id,Test.Name
FROM Test FULL OUTER JOIN Link ON Link.Test_id = Test.Id
FULL OUTER JOIN Bug ON Link.Bug_id = Bug.Id
INNER JOIN Test_Detail ON Test_Detail.Test_id = Test.Id
INNER JOIN Release ON Release.Id = Test.Release_id
INNER JOIN Cycle ON Cycle.Release_id = Release.Id

然而,这并没有提供预期的结果......

预期结果

结果

BugId | BugName | TestId | TestName
1     | Bug1    |
2     | Bug2    | 1100   | TC2
2     | Bug2    | 1200   | TC3
3     | Bug3    |
4     | Bug4    | 1000   | TC1
5     | Bug5    | 1200   | TC2
      |         | 1300   | TC4
      |         | 1400   | TC5
      |         | 1500   | TC6
    

结论

FULL OUTER JOIN 不是要使用的正确连接?你能帮助理解为什么它没有按预期工作吗?

谢谢

编辑 1

结果基于 Charlieface 的回答。

我收到了错误、测试和链接。但我只需要链接(如果存在)。如果没有链接,我需要测试和错误详细信息。如上文预期结果部分所述。

BugId | BugName | TestId | TestName
      |         | 1100   | TC2
      |         | 1200   | TC3
2     | Bug2    |        | 
2     | Bug2    | 1100   | TC2
2     | Bug2    | 1200   | TC3

编辑 2

完整请求

TESTCYCL 在这文章中是 TEST

SELECT disTINCT
B.BG_BUG_ID,B.BG_STATUS,B.BG_SUMMARY,B.BG_USER_TEMPLATE_13,B.BG_SEVERITY,B.BG_PRIORITY,B.BG_USER_TEMPLATE_10,B.BG_USER_TEMPLATE_08,R.REL_NAME,RC2.RCYC_NAME,B.BG_DETECTION_DATE,B.BG_RESPONSIBLE,B.BG_USER_TEMPLATE_03,B.BG_USER_03,B.BG_CLOSING_DATE,B.BG_USER_TEMPLATE_19,B.BG_USER_TEMPLATE_18,B.BG_DETECTED_BY,TC.TC_TESTCYCL_ID,TC.TC_TEST_ID,T.TS_NAME,TC.TC_STATUS,T.TS_USER_TEMPLATE_05,CF.CF_ITEM_NAME,C.CY_CYCLE,RC1.RCYC_NAME,TC.TC_USER_TEMPLATE_06,TC.TC_USER_TEMPLATE_05,TC.TC_USER_TEMPLATE_08
FROM TESTCYCL AS TC
INNER JOIN RELEASE_CYCLES AS RC1 ON TC.TC_ASSIGN_RCYC = RC1.RCYC_ID
INNER JOIN TEST AS T ON TC.TC_TEST_ID = T.TS_TEST_ID
INNER JOIN CYCLE AS C ON TC.TC_CYCLE_ID = C.CY_CYCLE_ID
INNER JOIN CYCL_FOLD AS CF ON C.CY_FOLDER_ID = CF.CF_ITEM_ID
FULL OUTER JOIN LINK AS L ON L.LN_ENTITY_ID = TC.TC_TESTCYCL_ID
FULL OUTER JOIN BUG AS B
INNER JOIN RELEASE_CYCLES AS RC2 ON B.BG_DETECTED_IN_RCYC = RC2.RCYC_ID
INNER JOIN RELEASES AS R ON B.BG_DETECTED_IN_REL = R.REL_ID
ON L.LN_BUG_ID = B.BG_BUG_ID

解决方法

您需要对连接重新排序。

将与一张表相关的所有 inner join 与该表放在一起。:

SELECT Bug.Id,Bug.Name,Test.Id,Test.Name
FROM Test
INNER JOIN Test_Detail ON Test_Detail.Test_id = Test.Id
INNER JOIN Release ON Release.Id = Test.Release_id
INNER JOIN Cycle ON Cycle.Release_id = Release.Id
FULL OUTER JOIN Link ON Link.Test_id = Test.Id
FULL OUTER JOIN Bug ON Link.Bug_id = Bug.Id

假设您也想将某些内容加入 Bug。为此,您需要嵌套 ON 条件:

SELECT Bug.Id,Test.Name
FROM Test
INNER JOIN Test_Detail ON Test_Detail.Test_id = Test.Id
INNER JOIN Release ON Release.Id = Test.Release_id
INNER JOIN Cycle ON Cycle.Release_id = Release.Id
FULL OUTER JOIN Link ON Link.Test_id = Test.Id
FULL OUTER JOIN Bug
      INNER JOIN Bug_Detail bd ON bd.Bug_id = Bug.id
  ON Link.Bug_id = Bug.Id

请注意,与流行观点相反,括号 () 在这里没有什么区别,尽管它们在视觉上很有用。重要的是 ON 子句的顺序:Bug_detail 内连接嵌套在 Bug

的全连接内 ,

你的内连接正在把完整的外连接变成别的东西。重新排列连接并使用括号:

SELECT Bug.Id,Test.Name
FROM (Test JOIN
      Test_Detail
      ON Test_Detail.Test_id = Test.Id JOIN
      Release
      ON Release.Id = Test.Release_id JOIN
      Cycle
      ON Cycle.Release_id = Release.Id
     ) FULL OUTER JOIN
     Link
     ON Link.Test_id = Test.Id FULL OUTER JOIN
     Bug
     ON Link.Bug_id = Bug.Id;

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。