Oracle Join 3表 - 需要所有结果

  • 我需要在test1中显示所有记录 - 这是主表

  • 我需要在test2中显示记录

  • 我需要在test3中显示记录

  • 最终查询=需要显示已加入的所有3个表的输出...

  • test2和test 3可能匹配也可能不匹配

  • test1将拥有所有记录 .

例如

select * from test1 where ID = '8675309';  = 1 entry 
select * from test2 where ID = '8675309'; = null
select * from test3 where ID = '8675309'; = 1 entry

我尝试过这种方法,但它没有按预期工作 .

SELECT
    t1.id
FROM
    test1 t1
    LEFT OUTER JOIN test2 t2 ON t2.id = t1.id
    LEFT OUTER JOIN test3 t3 ON t3.id = t1.id
    AND
        t1.id = '8675309'

结果未显示8675309,显示所有表值 .

回答(2)

2 years ago

SELECT
 t1.*
,t2.*
,t3.*
FROM
    test1 t1
    LEFT OUTER JOIN test2 t2 ON t2.id = t1.id
    LEFT OUTER JOIN test3 t3 ON t3.id = t1.id
    where
        t1.id = '8675309'

2 years ago

您需要 where 子句,而不是 on 子句 . 当 from 子句只有 left join 时,第一个表上的条件应该在 where 子句中 . 所有其他表的条件应该在 on 子句中 .

这可能听起来很神秘,但有一个简单的规则:即使 on 子句的计算结果为false, left join 也会保留第一个表中的所有行 . 因此,第一个表格的条件无关紧要 .

你要:

SELECT t1.id
FROM test1 t1 LEFT JOIN
     test2 t2
     ON t2.id = t1.id LEFT JOIn
     t3
     ON t3.id = t1.id
WHERE t1.id = 8675309;

我还应该注意到你过度简化了你的查询,所以它基本上相当于:

SELECT t1.id
FROM test1 t1
WHERE t1.id = 8675309;

我认为这不是你的意图 .